您的位置:首页 > 其它

《算法导论》笔记 第14章 14.3 区间树

2014-04-25 15:51 148 查看

【笔记】

待码!!!!!

把一个区间[t1,t2]表示为一个对象i,其各个域为low[i]=t1(低端点),high[i]=t2(高端点)。

我们说区间i和i'重叠,如果i∩i'≠ Ø。亦即如果low[i]<=high[i'],且low[i']<=high[i]。

任意两个区间i和i'满足区间三分法,也就是下列三种性质之一:

a) i 和 i' 重叠

b) i 在 i' 左边

c) i 在 i' 右边

区间树是一种对动态集合进行维护的红黑树,该集合中的每个元素x都包含一个区间int[x]。区间树支持下列操作:

INTERVAL-INSERT(T,x):将包含区间域int的元素x插入到区间树T中。

INTERVAL-DELETE(T,x):从区间树中删除元素x。

INTERVAL-SEARCH(T,i):返回一个指向区间树T中元素x的指针,使int[x]与i重叠;若集合中无此元素存在,则返回nil。

基础数据结构:红黑树,每个结点x包含一个区间域int[x],x的关键字为区间的低端点low[int[x]]。

附加信息:max[x],即以x为根的 子树中所有区间的端点的最大值。

对信息的维护:max[x] = max{ high[int[x]], max[left[x]], max[right[x]] }

设计新的操作:SEARCH,若left[x]!=nil且max[left[x]]>=low[i]则向右子树查询。

【练习】

14.3-1 写出作用于区间树的结点、并于O(1)时间内更新max域的LEFT-ROTATE的伪代码。

先维护旋转后的子树,在维护新的根。

14.3-2 重写INTERVAL-SEARCH代码,使得当所有的区间都是开区间时,它也能正确的工作。

其实把所有开区间都-1+1不就好了。

14.3-3 请给出一个有效的算法,使对给定的区间i,它返回一个与i重叠的、具有最小低端点的区间;或者,不存在返回nil。

SEARCH。

14.3-4 给定一个区间树T和一个区间i,请描述如何能在O(min(n,klgn))时间内,列出T中所有与i重叠的区间,此处k为输出区间数。

一个尽可能向右找的SEARCH。

14.3-5 支持操作INTERVAL-SEARCH-EXACTLY(T,i),它返回一个指向区间树T中结点x的指针,使low[int[x]]=low[i],high[int[x]]=high[i],不包含则返回nil。所有操作对于n结点树运行时间为O(lgn)。

暂缺

14.3-6 请说明如何来维护一个支持操作MIN-GAP的动态数集Q,使该操作能给出Q中最近的两个数之间的差幅。使操作INSERT,DELETE,SEARCH和MIN-GAP尽可能的高效,并分析它们的运行时间。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: