我有两组多个IP范围。每个IP范围都是一对(startIP, endIP)
长。所以我有两套a
和b
-
a = [(start11, end11), (start12, end12)...]
b = [(start21, end21), (start22, end22)...]
我希望找到a
但不在b
中的IP。或者换句话说set(ips_a) - set(ips_b)
。
我试图在a
中针对b
检查每个IP,但这个过程需要永远,因为每组中有超过1亿个IP。
想知道最优化的方法是什么。此外,如果任何现有模块执行此操作。
答案 0 :(得分:1)
您可以针对地址数量尝试以下O(n log n)
算法:
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)
。