首页 > 试题广场 >

(Tarjan的脱机最小公共祖先算法)在一棵有根树T中,两个

[问答题]
(Tarjan的脱机最小公共祖先算法)在一棵有根树T中,两个节点u和v的最小公共祖先(least commom ancestor)w是节点u和v的一个公共祖先,且它有最大的深度。在脱机最小公共祖先问题(off-line least commom ancestors problem)中,给定一棵有根树T和一个在T中的无序节点对的任意集合P={{u,v}},我们希望确定P中每对的最小公共祖先。
     为了解决脱机最小公共祖先问题,下面的过程通过对LCA(T.root)的初始调用,来执行对T的树遍历,假设在执行遍历之前,每个节点被着色为白色。
LCA(u)
1 MAKE-SET(u)
2 FIND-SET(u).ancestor=u
3 for each child v of u inT
4     LCA(v)
5     UNION(u,v)
6    FIND-SET(u).ancestor=u
7 u.color=BLACK
8 if each node v such that {u,v}P
9     if v.color=BLACK
10       print "The least commom ancestor of "u" and " v "is " FIND-SET(v).ancestor"
a.证明:对每对 {u,v}P,第10行恰好只执行一次。
b.证明:在调用LCA(u)时,不相交结合数据结构的集合数等于T中u的深度。
c.证明:对每对 {u,v}P,LCA能正确的输出u和v的最小公共祖先。
d.假设我们使用不相交集合数据结构实现,试分析LCA的运行时间。
回答a. 深度优先遍历的过程,树的每个结点都被visited一次(node.color = black),{u,v}涉及两个结点,故node为u或v都会继续执行,只有第二次成立时,line 9的v.color=black才成立,故line 10执行一次。
发表于 2021-05-12 15:37:43 回复(3)