算法导论第21章思考题

版权声明: https://blog.csdn.net/leelitian3/article/details/82184834

脱机最小值(off-line minimum problem)

输入

给定一个操作序列,包括INSERT(x)和EXTRACT-MIN,操作数x∈[1,n]

样例输入

4,8,E,3,E,9,2,E,E

输出

将第i次EXTRACT-MIN的数保存在extract[i]中

在线算法

建立一个优先队列,给定一个操作,马上在优先队列中做出相应改变即可

离线算法(off-line)

算法解释:将样例输入看成S1,E,S2,E,S3,E,S4,E,其中S1={4,8},S2={3},S3={9,2},S4={},为不相交的集合。i从小的开始找,如样例输入中最小的是2,调用FIND-SET(2),属于S3,所以extract[3]=2,随后,调用UNION(S3,S4),把S3合并到S4中。

算法的运行效率:O(n*α(n))

深度确定(depth-determination)

目的

维护一个具有MAKE-TREE、GRAFT、FIND-DEPTH操作的森林F={Ti}

实现

新建一个并查集森林S={Si},每个Si对应于一个Ti,Si中的结点额外保存了一个伪距离d

MAKE-TREE类似于MAKE-SET:node.p = node,node.d = 0

FIND-DEPTH类似于FIND-SET:在递归的过程中重置路径上结点的d,并把结点指向根节点

GRAFT类似于UNION:把a接到b上,a.d = b.d+1

时间效率

毫无疑问,O(m*α(m))

最小公共祖先算法(Lowest Common Ancestor)

不同于思考题,这里贴出一个讲义上的LCA算法:https://web.stanford.edu/class/cs97si/03-data-structures.pdf

算法时间

预处理每个结点:O(lgn),对于每个询问O(lgn)

算法流程

①计算出每个结点x的第2^k个祖先,并保存在Anc[x][k]中:

②对于每个询问(p,q),不妨设p.depth < q.depth。将q向上移动,调整至p.depth = q.depth

③for k = lgn to 0,若p、q的第2^k祖先相同,则尝试更小的k;若不同,则将p、q移至第2^k的祖先处

④重复这一过程,直到p=q

以上是本人的一点思考,如有错误还请指出~ 

猜你喜欢

转载自blog.csdn.net/leelitian3/article/details/82184834