相关疑难解决方法(0)

折叠一组可能重叠的范围有什么好的通用算法?

我有一个方法可以获得这个类的许多对象

class Range<T>
{
    public T Start;
    public T End;
}
Run Code Online (Sandbox Code Playgroud)

在我的情况TDateTime,但让我们使用int的简便性.我想要一种方法,将这些范围折叠成覆盖相同"区域"但不重叠的区域.

所以,如果我有以下范围

  • 1至5
  • 3到9
  • 11至15
  • 12至14岁
  • 13至20

该方法应该给我

  • 1至9
  • 11至20

猜猜它会被称为联盟?我想方法签名看起来像这样:

public static IEnumerable<Range<T>> Collapse<T>(
    this IEnumerable<Range<T>>, 
    IComparable<T> comparer)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

我在这里看了一些类似的其他问题,但我还没有找到它的实现.这个答案和同一问题的其他一些答案描述了算法,但我不太清楚我是否理解算法.也不是特别擅长实现算法,所以我希望有人可以帮助我.

c# generics algorithm union range

34
推荐指数
2
解决办法
4392
查看次数

需要一种算法将网络范围折叠成超集范围列表

我的数学功能让我失望!我需要一种将网络范围减少到超集的有效方法,例如,如果我输入IP范围列表:

  • 1.1.1.1至2.2.2.5
  • 1.1.1.2至2.2.2.4
  • 10.5.5.5至155.5.5.5
  • 10.5.5.6至10.5.5.7

我想返回以下范围:

  • 1.1.1.1至2.2.2.5
  • 10.5.5.5至155.5.5.5

注意:输入列表没有排序(虽然它们可能是?).执行此操作的简单方法是检查列表中的每个范围,以查看输入范围x是否为子集,如果是,则不插入范围x.但是,无论何时插入新范围,它都可能是现有范围的超集,因此您必须检查现有范围以查看它们是否可以折叠(例如,从我的列表中删除).

algorithm superset

13
推荐指数
3
解决办法
6100
查看次数

标签 统计

algorithm ×2

c# ×1

generics ×1

range ×1

superset ×1

union ×1