假设你有一个整数n
。我们假设您有一个非重叠整数范围列表,例如:
1-9
99-105
160-205
503-600
// many more thousands of ranges, etc ....
我可以很容易地迭代所有这些并检查n是否在每个边界之间并返回true,如果是的话。那将是O(n),这很糟糕。这可以在O(1)中完成吗?
一些规则:
我觉得我可以得到这些范围的二进制表示,并构建一个产生O(log(n))的树。
我的真实问题
我有一个IP地址子网列表。我需要测试给定的IP是否在任何子网中。我将检查许多IP。我可以将IP转换为整数(1.2.3.4 => 1 * 2 ^ 32 + 2 * 2 ^ 16 + 3 * 2 ^ 8 + 4)。我可以类似地转换子网。这相当于上面“更容易解释”的问题。
谢谢!
答案 0 :(得分:0)
在排序向量中存储范围并通过std :: lower_bound搜索值是O(log(n))。
使用该算法的IP 200.200.200.200需要哪个整数大小? 为什么不只是200200200200?
用于存储子网的IP A.B.C.D的四分支树似乎更合适。