【问题标题】:Detect if Integer is within multiple ranges of Integers efficiently有效检测整数是否在整数的多个范围内
【发布时间】:2016-11-18 01:46:48
【问题描述】:

假设您有一个整数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)。我可以类似地转换子网。这相当于上面的“更容易解释”的问题。

谢谢!

【问题讨论】:

    标签: ip-address numeric-ranges


    【解决方案1】:

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

    对于使用该算法的 IP 200.200.200.200,您需要多大的整数? 为什么不只是 200200200200?

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

    【讨论】:

      猜你喜欢
      • 2011-08-28
      • 2011-06-29
      • 2011-03-31
      • 2014-04-08
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      相关资源
      最近更新 更多