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

问题描述:

假设您有一个整数n。让我们假设你有不重叠的整数范围的列表,例如:检测整数是否在多个有效整数范围内

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

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

一些规则:

  • 的整数本身非常大,范围非常广泛,所以它不会是可行的,只是获得可接受的整数的完整列表,并使用类似的一套做的Ø (1)查找。将许多整数存储在内存中太昂贵了。我只能存储边界列表。
  • 我打算多次运行这个测试,所以我可以将列表制作成一些数据结构,如果这使得后续查找效率更高。

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

我真正的问题

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

谢谢!

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

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

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