区间树上的重叠区间查找算法

 

实验目的:

         熟悉并实现区间树上的重叠区间查找算法,分析该算法的性能。

问题定义

         尝试构造一个区间树。

         可依次插入下列数组中的元素:[8,9] [ 5,8] [15,23] [0,3] [6,10] [25,30] [17,19] [26,26] [19,20]

查找重叠区间:“find [22,25]”或“find [11,14]

输出格式:为重叠区间,依上例即为“[15,23],NIL

 

实验思想

基本概念:  区间:一个事件占用的时间

闭区间:实数的有序对[t1,t2],使t1t2

区间的对象表示:[t1,t2]可以用对象i表示,有两个属性:

low[i]=t1//起点或低点

high[i]=t2//终点或高点

区间的重叠:ii’∅⇔(low[i]high[i’]) and (low[i’]high[i])

数据结构:本质上是将红黑树扩充,方法如下:

tep 1:基本结构

以红黑树为基础,对xTx包含区间int[x]的信息(低点和高点)key=low[int[x]]

Step 2:附加信息

max[x]=max(high[int[x]], max[left[x]], max[right[x]])

Step 3:维护附加信息(有效性)

由定理14.1max的定义有效

Step 4:开发新操作

查找与给定区间重叠的区间keymax节点x

 

查找算法IntervalSearch(T, i)基本思想:

step 1x root[T]//从根开始查找

step 2:若xnil[T]iint[x]不重叠

if x的左子树非空且左子树中最大高点≥low[i] then

x left[x]//x的左子树中继续查找

else //左子树必查不到,到右子树查

x right[x]

step 3:返回x //x=nil or ix重叠

由于区间树是红黑树的简单扩重,因此区间树相关操作的实现如左旋、右旋、插入,插入调整等与红黑树基本相同,具体而言,仅仅在左旋和右旋的操作中维护max域的取值争取即可,其他与红黑树操作完全相同。

测试数据及结果

本测试的硬件以及软件环境如下

         CPUPM 1.5G; 内存:768M;操作系统:windows xp sp2;软件平台:JDK1.5;开发环境:eclipse test1: find [22,25] 找到了重叠区间[15,23]

Test2

find [11,14] 没有找到重叠区间

实验结论以及算法分析

通过测试证明算法正确有效。


  
  
   
    
  
  
区间树上的重叠区间查找算法时间复杂度分析
    
    
    对于任意一个具有n个结点的区间树,我们最多需要循环logn+2次,(即从根节点查找到叶子
结点),每次循环都是常数时间,故在最坏情况下时间复杂度为O(log n)
    
    
在一个比较差的搜索中,假设每次我们寻找的区间都是叶子结点,在这个情况下的时间复杂度
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值