检测整数是否在多个整数范围内有效

时间:2016-11-18 01:46:49

标签: ip-address numeric-ranges

假设你有一个整数n。我们假设您有一个非重叠整数范围列表,例如:

1-9
99-105
160-205
503-600
// many more thousands of ranges, etc ....

我可以很容易地迭代所有这些并检查n是否在每个边界之间并返回true,如果是的话。那将是O(n),这很糟糕。这可以在O(1)中完成吗?

一些规则:

  • 整数本身非常大,范围非常宽,因此仅仅获取可接受整数的完整列表并使用类似Set进行O(1)查找是不可行的。在内存中存储许多整数太昂贵了。我只能存储边界列表。
  • 我将多次运行此测试,因此我可以将列表预先设置为一些数据结构,如果这样可以使后续查找更有效。

我觉得我可以得到这些范围的二进制表示,并构建一个产生O(log(n))的树。

我的真实问题

我有一个IP地址子网列表。我需要测试给定的IP是否在任何子网中。我将检查许多IP。我可以将IP转换为整数(1.2.3.4 => 1 * 2 ^ 32 + 2 * 2 ^ 16 + 3 * 2 ^ 8 + 4)。我可以类似地转换子网。这相当于上面“更容易解释”的问题。

谢谢!

1 个答案:

答案 0 :(得分:0)

在排序向量中存储范围并通过std :: lower_bound搜索值是O(log(n))。

使用该算法的IP 200.200.200.200需要哪个整数大小? 为什么不只是200200200200?

用于存储子网的IP A.B.C.D的四分支树似乎更合适。