中科大软院算法导论区间树实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
区间树实验报告
1.区间树的实验源码见另外一个文件
2.区间树实验分析
2.1 需求分析
基础数据结构选择红黑树,每个结点x 包含一个区间域int[x],x 的关键字为区间的低端点low[int[x]],对树;进行中序遍历就可按低端点的次序列出个区间,结点还包含一个max[x],即以x 为根的子树中所有区间的端点的最大值。
如:
实验要求:将红黑树扩展为区间树
(1)区间的端点为正整数,随机生成;
(2)内部节点数为n:2^4,2^6,2^8,2^10,2^12;
(3)测试插入,删除,查找的时间并绘出曲线,运行次数为10 次;
2.2 程序设计
区间树的操作基本和红黑树的相同,在其基础上增加了一个新方法:
INTERVAL_SEARCH(T,i);它用来找出树中覆盖区间i 的那个结点。
如果树中不存在,则返回nil[T]指针。
代码如下:
ITNode* IntervalTree::Interval_Search(Interval i){
ITNode* x=root;
while(x!=Nil && !x->Overlap(i)){
// x != nil and i doesn't overlap int[x]
if (x->left!=Nil && x->left->max>=i.low)
x=x->left;
else x=x->right;
}
return x;
}
区间树的插入、删除除了有可能改变红黑树性质,还有可能改变结点的max 值。
前者向红黑树那样处理就可以了,又
max[x] = max(high[int[x]], max[left[x]], max[right[x]])
为解决后者,增加一方法Nodemax(),让它来维护结点的max 值。
Nodemax()如下:void ITNode::NodeMax(ITNode* xl, ITNode* xr){
Type tp=this->interval->high;
if (tp < xl->max)
tp=xl->max;
if(tp < xr->max)
tp=xr->max;
this->max=tp;
}
在左旋、右旋时调用此方法。
2.3 数据结构设计
基础数据结构选择红黑树,每个结点x 包含一个区间域int[x],x 的关键字为区间的低
端点low[int[x]],对树;进行中序遍历就可按低端点的次序列出个区间,结点还包含一个max[x],即以x 为根的子树中所有区间的端点的最大.
2.4 运行结果
为了增加算法运行时间减少误差,search、insert、delete 的都是树的最小关键字结点,
让查找深度尽可能的深。
运行时间如下所示,单位:us:
T(us)
方法
search insert delete
2^4 2.933 14.176 2.933
2^6 3.399 17.098 3.422
2^8 3.422 20.042 3.911
2^10 4.399 17.598 4.547
2^12 3.441 18.087 4.888
运行平台:
2.5 结果分析
根据以上数据作如下t-lg(n)图像:
有图知当n=2^8 时,Insert 操作数据不是很好,出去它可得如下图:
在树规模较小的时候, 会对n 造成比较明显的影响, 3 条测量的曲线中, insert 与lgn 的
曲线增长率最符合,但都大致以lgn 增长。
,在n 较小的时候, 算法执行时间受系统本身配置
影响较大, 数据也不会很准确, 这个也可以从表格中看出, 有一些与通常时间偏差较大的记录, 这个应该和系统的任务调度, 和其他程序的影响有关.
2.6 心得体会
由于区间树的很多操作与红黑书相似,此程序最大难点在维护结点的max 值。
应仔细
分析左旋、右旋、插入、删除时改变那些结点的max 值、如何改变结点的max 值,这样编程时会事半功倍。
区间树与红黑树差别不是很大,很多操作都相似,可考虑从红黑树继承,实现代码重用。
例如:
class ITNode: public RBTNode{
private:
Type NodeMax(ITNode* x);
public:
Type max; //以x 为根的子树中所有区间的端点最大值
Type low;
Type high;
ITNode(Type ilow=0, Type ihigh=0):RBTNode(ilow), low(ilow),
high(ihigh){max=NodeMax(this)}
};
class IntervalTree : public RBTree{
public:
IntervalTree(Type ilow=0, Type ihigh=0):RBTree(ilow){}
void Interval_Insert(ITNode* x){RB_Insert(x);}
void Interval_Insert(Type ilow, Type ihigh){Interval_Insert(new ITNode(ilow,ihigh));} void Interval_Delete(ITNode* x){RB_Delete(x);}
ITNode* Interval_Search(Interval i);
};。