CLRS第十三章思考题
2016-01-28 08:43
169 查看
思考题13-1
a) 对于插入操作,需要更改根结点到插入的新叶结点路径上的所有结点;对于删除操作,至多改变被删除的节点和其后继的祖先结点。b) 先假设会调用两个子程序
MAKE-NEW-NODE(k)、
COPY-NODE(x)。其中
MAKE-NEW-NODE(k)创建一个关键字为 kk 的结点,该结点的左右孩子为空,然后返回一个指向这个结点的指针。
COPY-NODE(x)创建一个和结点 xx 所指的结点有相同属性的结点(即有相同 key,left,rightkey,left,right)并返回创建的指向这个结点的指针。
PERSISTENT-TREE-INSERT(r, k) if r == NIL x = MAKE-NEW-NODE(k) else x = COPY-NODE(r) if k < r.key x.left = PERSISTENT-TREE-INSERT(r.left, k) else x.right = PERSISTENT-TREE-INSERT(r.right, k) return x
初始调用需要将
T.root作为第一个参数。
c) 时间复杂度、空间复杂度都为 O(h)O(h)。
d) 若有 parentparent 属性,在插入时,所有结点都要被拷贝一次。因为根结点的孩子结点要指向新的根结点,它们的孩子结点又要指向它们,等等。。。由于有 nn 个结点,所以需要花费 Ω(n)\Omega(n)。
e) 从 a) 和 c) 我们知道,插入到一颗高为 hh 的持久二叉搜索树需要 O(h)O(h),对一颗高为 h=O(lgn)h=O(\lg n) 的红黑树,插入需要 O(lgn)O(\lg n) 时间,所以我们需要证明的是如果一颗红黑树是持久的,插入操作可以在 O(lgn)O(\lg n) 时间完成。需要证明两个地方:
1) 怎么在没有 parentparent 的情况下在 O(1)O(1) 时间内找到指向父结点的指针。
2) 在红黑树的旋转和着色过程中,需要改变的结点所做的改变不会超过 O(lgn)O(\lg n) 。
对于1),我们除了使用和红黑树差不多的
RB-INSERT函数外,还需要一个栈来保存从根结点到插入结点位置所经过的结点,然后将栈传给
RB-INSERT-FIXUP,这样就可以在O(1)O(1) 时间内找到指向父结点的指针;
对于2),证明略。
同样的也可以相似的证明删除持久的红黑树最坏只要 O(h)O(h) 时间。
思考题13-2
暂略思考题13-3
暂略思考题13-4
暂略相关文章推荐
- H5小内容(三)
- 被解放的姜戈03 所谓伊人
- qt 静态成员函数
- win10 build 11102突变Build 14251到底怎么回事?
- JS实现动态生成表格并提交表格数据向后端
- Linux 基金会引发巨大争议,它到底是企业的还是草根的?
- Spring MVC +Mybatis + Maven 配置之Transaction配置
- 将ImageView中的图片保存到本地相冊
- C++ 读取INI文件
- ElasticSearch 2 (1) - Getting Start
- ffmpeg写mp4时不断打印:Error parsing ADTS frame header!
- HDOJ 1094 A+B for Input-Output Practice (VI)
- nyoj 523 亡命逃窜 【BFS】
- ubuntu安装和配置SVN
- 代码开发管理: 持续集成
- ERROR: Packet for query is too large (2034> 1024)
- 20. Valid Parentheses
- 数学之路(机器学习实践指南)-文本挖掘与NLP(2)
- IAR中ICF文件分析与应用
- 被解放的姜戈02 庄园疑云