【发布时间】:2010-09-14 01:20:51
【问题描述】:
我的数学让我失望了!我需要一种将网络范围缩小为超集的有效方法,例如如果我输入 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。但是,每当您插入新范围时,它可能是现有范围的超集,因此您必须检查现有范围以查看它们是否可以折叠(例如,从我的列表中删除)。
【问题讨论】:
-
范围会不相交吗?如果不是,您希望您的算法如何处理重叠范围,其中许多子范围可能是其中的一部分?
-
使用您描述的“朴素”算法有什么问题?对我来说似乎很好......
-
好问题!用户可以输入他们想要的任何范围,因此不能保证它们是不相交的。实际上,如果所有连续的范围都可以合并为一个,那就太好了。
-
致 MikeF:如果我每次插入时都必须与列表中的每个现有项目进行比较,那么天真的方法可能会像废话一样慢。我们有一些客户的范围 > 40k(并且他们想要添加更多!)。我不想进行 40k 比较来进行插入。
-
如前所述,幼稚的方法也无法处理两个范围重叠但一个范围不完全包含在另一个范围内的情况。
标签: algorithm