【问题标题】:How to build a data-structure to support some range queries如何构建数据结构以支持某些范围查询
【发布时间】:2015-05-25 08:43:56
【问题描述】:

间隔由开始和结束定义。

给定一个范围[例如,0-999] 内的一组可能重叠的区间, 构建数据结构以支持以下范围查询 时间复杂度

.

Overlap(start, end) = 与 [start, end] 重叠的所有区间的集合

Within(start, end) = 位于 [start, end] 内的所有区间的集合

在哪里,

Intervals I1[start1, end1], I2[start2, end2] are said to overlap with  each other iff start1<end2 && start2<end1
Interval I1[start1, end1] is said to be within interval I2[start2,end2] iff start1>start2 && end1<end2

【问题讨论】:

  • @Laurentiu L. 你能详细说明这个问题的目标,结果数据结构应该是什么样子吗?
  • @LaurentiuL。我了解范围查询将返回上述间隔集。但是数据结构(假设是一个数组)会是什么样子呢?我可以编写范围查询逻辑,但我不确定数据结构会是什么样子。你能展示一个样本吗?
  • 当我先写下来时,问题的某些部分丢失了。现在这证明你们不知道我在要求什么,并假设我想要一个解决方案。你甚至没有正确阅读我的问题。请不要无缘无故发表评论。
  • 您尝试构建的称为区间树 (en.wikipedia.org/wiki/Interval_tree) - 一种用于保存区间的有序树数据结构。具体来说,它允许人们有效地找到与任何给定区间或点重叠的所有区间。维基百科页面有几个示例和“搜索所有重叠间隔”解决方案。前任。 codereview.stackexchange.com/questions/42008/… , sanfoundry.com/java-program-implement-interval-tree 注:infotechgems.blogspot.ro/2011/11/…
  • 谢谢@LaurentiuL。!我以前从未听说过间隔树。至少现在我知道在哪里实现我的代码了!

标签: java python data-structures time-complexity


【解决方案1】:

这个问题涉及的数据结构称为Interval tree

一个有序的树数据结构来保存间隔,它允许一个 有效地找到与任何给定间隔重叠的所有间隔或 点。

两种有效的方法:

链接中提出的用于搜索所有重叠区间的算法预计会比传统的区间树(增广树)更快地进行搜索操作,添加元素会慢一些。

实现区间树的各种方法:

在实施解决方案时,您应该知道performance of java collections processing

【讨论】:

    【解决方案2】:

    使用区间树编写了一些 Scala 代码来实现这一点!

    class IntervalSearchTree {
         var root=new IntervalNode(null,null,null,null,null);
    
      class IntervalNode(var left:IntervalNode,var start:Integer,var end:Integer,var maxEnd:Integer,var right:IntervalNode);
    
        def add(start:Integer,end:Integer ):Unit={
          var node:IntervalNode=root
          while(node!=null){
            if(end>node.maxEnd)
              node.maxEnd=end
            if (start < node.start) {
                    if (node.left == null) {
                        node.left = new IntervalNode(null, start, end, end, null);
                        return;
                    }
                    node = node.left;
                } else {
                    if (node.right == null) {
                        node.right = new IntervalNode(null, start, end, end, null);
                        return;
                    }
                    node = node.right;
                }
          }
          root =  new IntervalNode(null, start, end, end, null);
        }
    
        def overlap(start:Integer,end:Integer):Unit={
    
          var intervalNode:IntervalNode=root;
          while (intervalNode != null) {
             if (intersection(start, end, intervalNode)){
               println(intervalNode.start+"-"+intervalNode.end)
             }
             if (leftSubTree(start, end, intervalNode.left)) {
                    intervalNode = intervalNode.left;
    
    
                } else {
    
                    intervalNode = intervalNode.right;
    
                }
    
    
          }
    
        }
    
        def within(start:Integer,end:Integer):Unit={
            var intervalNode:IntervalNode = root;
            while (intervalNode != null) {
               if (subset(start, end, intervalNode)){
               println(intervalNode.start+"-"+intervalNode.end)
             }
             if (leftSubTree(start, end, intervalNode.left)) {
                    intervalNode = intervalNode.left;
    
    
                } else {
    
                    intervalNode = intervalNode.right;
    
                }
            }
    
        }
    
    
        def subset(start:Integer,end:Integer,intervalNode:IntervalNode):Boolean={
          return start<intervalNode.start  && end >intervalNode.end ;
        }
    
        def intersection(start:Integer,end:Integer,intervalNode:IntervalNode):Boolean={
          return start < intervalNode.end && end > intervalNode.start;
        }
    
        def leftSubTree(start:Integer,end:Integer,intervalLeftSubtree:IntervalNode):Boolean={
          return intervalLeftSubtree != null && intervalLeftSubtree.maxEnd > start;
        }
    
    
        def main(args: Array[String]): Unit = {
          var intervalSearchTree=new IntervalSearchTree()
            intervalSearchTree.add(17, 19);
            intervalSearchTree.add(5, 8);
            intervalSearchTree.add(21, 24);
            intervalSearchTree.add(22, 24);
            intervalSearchTree.add(20, 26);
            intervalSearchTree.add(20, 24);
            intervalSearchTree.add(4, 8);
            intervalSearchTree.add(5, 9);
            intervalSearchTree.add(15, 18);
            intervalSearchTree.add(7, 10);
            intervalSearchTree.add(16, 22);
    
            //Input for testing overlaps 
            println("Overlaps");
            intervalSearchTree.overlap(23, 25);
            //Input for testing overlaps
            println("Within");
            intervalSearchTree.within(4, 25);
        }
    
    
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多