赞
踩
输入
给定一个操作序列,包括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))
目的
维护一个具有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))
不同于思考题,这里贴出一个讲义上的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
以上是本人的一点思考,如有错误还请指出~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。