【问题标题】:Best data structure to efficiently allow pull of all ranges (min,max) such that value >= min and value <= max?有效允许拉取所有范围(最小值,最大值)的最佳数据结构,使得值 >= 最小值和值 <= 最大值?
【发布时间】:2011-01-28 00:50:39
【问题描述】:

假设我有一组最小值和最大值。我想要一个数据结构,给定一个外部值,最有效地为我提供 value >= min,value

如果您知道范围不重叠,我想您可以在 min 上做一个平衡的二叉搜索树,并且满足 (min,max) 的第一个节点必须是唯一的一个。但如果范围可以重叠,是否有一种数据结构可以让您有效地做到这一点?

【问题讨论】:

  • 正在使用什么样的数据值?整数?双打?浮动?字符串?
  • 列表不能在 O(n) 中做到这一点吗? foreach(pair) check max and min; push on answer;
  • EvilTeach:这些将是整数或长整数。 nonnb:我没有使用 RDBMS,否则我会这样做......问题实际上是我不能使用 RDBMS 并且正在尝试实现索引所带来的速度提升。 Marnix:例如,在不重叠的情况下,使用 BST 会显着提高速度,因为您需要 O(ln(n)),而且数据集非常大。我要在这里实现最高效率。理想情况下,创建索引或数据结构只是一开始的开销,这让后面的操作运行得更快。
  • 范围大小是否有限制。

标签: data-structures


【解决方案1】:

您所描述的问题也称为“刺伤查询”。它在图形编程教科书中得到了很好的描述,这是一个非常相关的问题。

另外,segment trees 上的维基百科页面可能会有所帮助。这些树就是通常用来解决这个问题的数据结构。

【讨论】:

    【解决方案2】:

    我认为答案实际上可能是这个http://en.wikipedia.org/wiki/Interval_tree。给定一个点或一组点,它可以让您有效地拉出令人满意的间隔。当然,唯一需要注意的是,初始数据结构的构建效率不高,但这在任何索引等中也是不可避免的。

    【讨论】:

    • 这似乎是正确的解决方案。区间树 wiki 准确地描述了您的要求
    【解决方案3】:

    一种可能的方法是将 (min,max) 放入一个数组中,然后按思维排序 然后用二分查找数组中mins满足条件的区域再查找。

    【讨论】:

    • 我考虑过这种方法,但想知道是否有办法避免对 mins 满足条件的数组进行完整搜索。
    【解决方案4】:

    查询可以用Range Tree:a binary tree of binary trees解决。

    外部树是对 (x, y) 的值 x 的搜索树。对 (x, y) 存储在叶节点中。外部树的每个节点 V 都包​​含一个指向 y 索引搜索树 Y 的指针,其中包含 V 的子树的所有对。

    要解决范围查询 ([Value, infinity) = RangeX, RangeY),向下搜索最左边的 xmin 满足 Value min。设 V 是通往 xmin 的路径上的一个节点。如果搜索向左,则 V 的 子树的搜索树 Y 包含所有在 RangeX 中的对。将 RangeY 中的所有 Y 对添加到结果中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 2014-03-22
      • 2020-07-03
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 2018-01-08
      相关资源
      最近更新 更多