【问题标题】:Different IPs between sets of IP rangesIP范围集之间的不同IP
【发布时间】:2018-04-09 20:47:45
【问题描述】:

我有两组多个 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 中的每个 IP 与 b,但该过程需要很长时间,因为每组中有超过 1 亿个 IP。

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

【问题讨论】:

  • 请添加一个实际示例(以及您尝试过的...)。
  • 你想要代码吗?我正在获取a 的每个范围内的每个 IP,并针对b 中的每个start, end 进行检查。仅用于循环。
  • 那不是代码,那是代码描述

标签: javascript algorithm ip set-difference


【解决方案1】:

您可以尝试以下算法,即O(n log n) 关于地址数量:

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

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

【讨论】:

  • 啊,太好了!这肯定会降低复杂性。复杂度是O(nlogm), m = 范围数?在我的情况下,范围只有几千,我认为这应该是O(n)
  • @hyades 它是O(n log n),其中n 是较长列表中的范围数,无论它是什么。
猜你喜欢
  • 2010-12-09
  • 2011-03-10
  • 1970-01-01
  • 2018-01-04
  • 2019-09-02
  • 1970-01-01
  • 2019-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多