实验目的:
熟悉并实现区间树上的重叠区间查找算法,分析该算法的性能。
问题定义
尝试构造一个区间树。
可依次插入下列数组中的元素:[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],使t1≤t2
区间的对象表示:[t1,t2]可以用对象i表示,有两个属性:
low[i]=t1//起点或低点
high[i]=t2//终点或高点
区间的重叠:i∩i’≠∅⇔(low[i]≤high[i’]) and (low[i’]≤high[i])
数据结构:本质上是将红黑树扩充,方法如下:
tep 1:基本结构
以红黑树为基础,对∀x∈T,x包含区间int[x]的信息(低点和高点),key=low[int[x]]。
Step 2:附加信息
max[x]=max(high[int[x]], max[left[x]], max[right[x]])
Step 3:维护附加信息(有效性)
由定理14.1及max的定义⇒有效
Step 4:开发新操作
查找与给定区间重叠的区间keymax节点x
查找算法IntervalSearch(T, i)基本思想:
step 1:x ←root[T];//从根开始查找
step 2:若x≠nil[T]且i与int[x]不重叠
if x的左子树非空且左子树中最大高点≥low[i] then
x ←left[x];//到x的左子树中继续查找
else //左子树必查不到,到右子树查
x ←right[x];
step 3:返回x //x=nil or i和x重叠
由于区间树是红黑树的简单扩重,因此区间树相关操作的实现如左旋、右旋、插入,插入调整等与红黑树基本相同,具体而言,仅仅在左旋和右旋的操作中维护max域的取值争取即可,其他与红黑树操作完全相同。
测试数据及结果
本测试的硬件以及软件环境如下
CPU:PM 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)。
在一个比较差的搜索中,假设每次我们寻找的区间都是叶子结点,在这个情况下的时间复杂度