您的位置:首页 > 其它

算法导论14.3区间树 练习总结

2015-10-29 00:58 267 查看
14.3-1 写出作用于区间树的结点且在 O(1) 时间内更新 max 属性的过程 LEFT-ROTATE 的伪代码。

ANSWER:

伪代码:
LEFT-ROTATE(T, x)
y = x.right
y.max = x.max
x.max = max(x.left.max, y.left.max, x.int.high)</span></span>


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

ANSWER:将第 3 行的 x.left.max ≥ i.low 改为 x.left.max > i.low。

14.3-3 请给出一个有效的算法,对一个给定的区间 i,返回一个与 i 重叠且具有最小低端点的区间;或者当这样的区间不存在时返回 T.nil。

ANSWER:

伪代码:
MIN-SEARCH(T, i)
x = T.root
res = T.nil
mark = INT_MAX
while x != T.nil
if i overlap x.int
if x.int.low < mark
mark = x.low
res = x
if x.left != T.nil and x.left.max ≥ i.low
x = x.left
else
x = x.right
return res</span>


14.3-4 给定一棵区间树 T 和一个区间 i,试描述如何在 O(min(n,klgn)) 时间内列出 T 中所有与 i 重叠的区间,其中 k 为输出的区间数。(提示:一种简单的方法是做若干次查询,并且在这些查询操作中修改书,另一种略为复杂点的方法是不对树进行修改。)

ANSWER:类似于前序遍历,但时间仍为 O(min(n,klgn))。

伪代码:
SEARCH-ALL(T.root, i)
x = T.root
if i overlap x.int
print x
if x.left != T.nil and x.left.max ≥ i.max
SEARCH-ALL(x.left, i)
if x.right != T.nil and x.right.int.low ≤ i.high and x.right.max ≥ i.low
SEARCH-ALL(x.right, i)</span>


14.3-5 对区间树 T 和一个区间 i,请修改有关区间树的过程来支持新的操作 INTERVAL-SEARCH-EXACTLY(T, i),它返回一个指向 T 中结点 x 的指针,使得 x.int.low = i.low 且 x.int.high = i.high;或者,如果 T 不包含这样的区间时返回 T.nil。所有的操作(包含 INTERVAL-SEARCH-EXACTLY)对于包含 n 个结点的区间树的运行时间都应为 O(lgn)。

ANSWER:直接按照 i.low 搜索二叉树,然后判断 x.int.high 是否等于 i.high 即可。

14.3-6 说明如何来维护一个支持操作 MIN-GAP 的一些数的动态集 Q,使得该操作能给出 Q 中两个最接近的数之间的差值。例如,Q = {1, 5, 9, 15, 18, 22},则 MIN-GAP 返回 18 -15 = 3,因为 15 和 18 是 Q 中两个最接近的数。要使得操作 INSERT、DELETE、SEARCH 和 MIN-GAP 尽可能高效,并分析它们的运行时间。

ANSWER:给红黑树的每个结点新增 min、max、mingap 属性。

x.min(以 x 为根的树中最小的关键字。):插入时,只需更新插入的结点至根结点路径上 O(lgn) 个结点。更新结点操作 x.min = min(x.left.min, x.key) 只需 O(1) 时间,所以插入操作对更新 min 属性也是 O(lgn) 时间。删除同理。

x.max(以 x 为根的树中最大的关键字。):插入删除和 x.min 类似。x.max = max(x.right.max, x.key)。

x.mingap(以 x 为根的树的 MIN-GAP):插入删除依然是 O(lgn) 时间更新 mingap 属性,x.mingap = min(x.left.mingap, x.right.mingap, x.key - x.left.max, x.right.min - x.key)。

综上,INSERT、DELETE、SEARCH 时间为 O(lgn),MIN-GAP 时间为 O(1)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: