IP范围集之间的不同IP

时间:2017-10-28 10:30:11

标签: javascript algorithm ip set-difference

我有两组多个IP范围。每个IP范围都是一对(startIP, endIP)长。所以我有两套ab -

a = [(start11, end11), (start12, end12)...]
b = [(start21, end21), (start22, end22)...]

我希望找到a但不在b中的IP。或者换句话说set(ips_a) - set(ips_b)

我试图在a中针对b检查每个IP,但这个过程需要永远,因为每组中有超过1亿个IP。

想知道最优化的方法是什么。此外,如果任何现有模块执行此操作。

1 个答案:

答案 0 :(得分:1)

您可以针对地址数量尝试以下O(n log n)算法:

  • 我假设在每个列表中,IP地址范围没有重叠。如果他们这样做,则消除这些重叠(合并范围)。
  • 按范围的开头对两个列表进行排序。
  • 循环使用两个变量,一个跟踪第一个列表中的当前位置,让我们称之为i,另一个跟踪第二个列表中的当前位置,让我们称之为j
  • b[j] < a[i],增加j。也就是说,跳过b[j]之前的a[i],而不是与a[i]重叠。
  • 如果a[i]b[j]重叠,请从a[i]中删除重叠的部分,然后增加i
  • 重复直到达到a的结尾。因此,a中同样位于b的所有范围都将从a中删除。

由于排序步骤,此算法的时间复杂度为O(n log n)

相关问题