基本思想(聚集方法需要精细分析,会计方法需要一步一步猜,势能方法需要构思势能函数)
聚集方法:分析整体的时间复杂度,每一步都假设代价相同,然后除以n
一般需要精细分析,并不是看一眼就行了的那种
会计方法:为不同的操作赋予不同的代价,然后按每一步的操作分析代价
设cic_ici和αi\alpha_iαi是操作iii的实际代价和平摊代价∑1≤i≤nαi−∑1≤i≤nci≥0\sum_{1\le i\le n}{\alpha_i}-\sum_{1\le i\le n}{c_i}\ge 0∑1≤i≤nαi−∑1≤i≤nci≥0必须对于任意nnn个操作序列都成立
势能方法:为不同的操作赋予不同的代价,然后对整个问题分析代价
考虑在初始数据结构D0D_0D0上执行nnn个操作,对于操作iii,操作iii的实际代价为cic_ici,操作iii将数据结构Di−1D_{i-1}Di−1变为DiD_iDi,数据结构DiD_iDi的势能是一个实数ϕ(Di)\phi(Di)ϕ(Di),ϕ\phiϕ是一个正函数,操作iii的平摊代价:αi=ci+ϕ(Di)−ϕ(Di−1)\alpha_i=c_i+\phi(D_i)-\phi(D_{i-1})αi=ci+ϕ(Di)−ϕ(Di−1),nnn个操作的总平摊代价(必须是实际代价的上界)∑i=1nαi=∑i=1n(ci+ϕ(Di)−ϕ(Di−1))=∑i=1nci+ϕ(Dn)−ϕ(D0)\sum_{i=1}^{n}\alpha_i=\sum_{i=1}^{n}(c_i+\phi(D_i)-\phi(D_{i-1}))=\sum_{i=1}^{n}c_i+\phi(D_n)-\phi(D_{0})∑i=1nαi=∑i=1n(ci+ϕ(Di)−ϕ(Di−1))=∑i=1nci+ϕ(Dn)−ϕ(D0)
基本例题
1.栈的操作
操作Multipop(S,k)Multipop(S, k)Multipop(S,k): 去掉SSS的kkk个顶对象, 当∣S∣<k|S|<k∣S∣<k时弹出整个栈
Multipop(S,k)(1)WhilenotSTACK−EMPTY(S)andk≠0Do(2)Pop(S);(3)k←k−1.Multipop(S, k)\\
(1) While\quad not\quad STACK-EMPTY(S)\quad and\quad k\ne 0\quad Do\\
(2)\quad Pop(S);\\
(3)\quad k\leftarrow k-1.Multipop(S,k)(1)WhilenotSTACK−EMPTY(S)andk=0Do(2)Pop(S);(3)k←k−1.
假设PopPopPop的代价是1,那么Multipop(S,k)Multipop(S, k)Multipop(S,k)的代价就是min{∣S∣,k}min\{|S|,k\}min{∣S∣,k}
初始栈为空的nnn个栈操作序列的分析nnn个栈操作序列由PushPushPush、PopPopPop和MultipopMultipopMultipop组成
聚集方法:
(1)粗略分析:最坏情况下,每个操作都是MultipopMultipopMultipop,每个MultipopMultipopMultipop的代价最坏是O(n)O(n)O(n),操作系列的最坏代价为T(n)=O(n2)T(n)=O(n^2)T(n)=O(n2),平摊代价为T(n)/n=O(n)T(n)/n=O(n)T(n)/n=O(n)
(2)精细分析:一个对象在每次被压入栈后至多被弹出一次,在非空栈上调用PopPopPop的次数(包括在MultipopMultipopMultipop内的调用)至多为PushPushPush执行的次数, 即至多为nnn,最坏情况下操作序列的代价为T(n)≤2n=O(n)T(n)\le 2n=O(n)T(n)≤2n=O(n),平摊代价=T(n)/n=O(1)=T(n)/n=O(1)=T(n)/n=O(1)
会计方法:
Cost(PUSH)=2Cost(PUSH)=2Cost(PUSH)=2一个1用来支付PUSHPUSHPUSH的开销,另一个1存储在压入栈的元素上,预支POPPOPPOP的开销,Cost(POP)=0Cost(POP)=0Cost(POP)=0,Cost(MULTIPOP)=0Cost(MULTIPOP)=0Cost(MULTIPOP)=0这样∑1≤i≤nαi−∑1≤i≤nci≥0\sum_{1\le i\le n}{\alpha_i}-\sum_{1\le i\le n}{c_i}\ge 0∑1≤i≤nαi−∑1≤i≤nci≥0就成立了
势能方法:
ϕ(Dm)\phi(D_m)ϕ(Dm)定义为栈DmD_mDm中对象的个数,ϕ(D0)=0\phi(D_0)=0ϕ(D0)=0,D0D_0D0是空栈 ϕ(Di)≥0=ϕ(D0)\phi(D_i)\ge 0=\phi(D_0)ϕ(Di)≥0=ϕ(D0), 因为栈中对象个数不会小于0。栈操作的平摊代价(设栈Di−1D_{i-1}Di−1中具有sss个对象)PUSHPUSHPUSH: αi=ci+ϕ(Di)−ϕ(Di−1)=1+(s+1)−s=2\alpha_i=c_i+\phi(D_i)-\phi(D_{i-1})=1+(s+1)-s=2αi=ci+ϕ(Di)−ϕ(Di−1)=1+(s+1)−s=2;POP:αi=ci+ϕ(Di)−ϕ(Di−1)=1+(s−1)−s=0POP: \alpha_i=c_i+\phi(D_i)-\phi(D_{i-1})=1+(s-1)-s=0POP:αi=ci+ϕ(Di)−ϕ(Di−1)=1+(s−1)−s=0;MULTIPOP(S,k)MULTIPOP(S, k)MULTIPOP(S,k): 设k′=min(k,s)k'=min(k,s)k′=min(k,s),αi=ci+ϕ(Di)−ϕ(Di−1)=k’+(s−k’)−s=k’−k’=0\alpha_i=c_i+\phi(D_i)-\phi(D_{i-1})=k’+(s-k’)-s=k’-k’=0αi=ci+ϕ(Di)−ϕ(Di−1)=k’+(s−k’)−s=k’−k’=0
2.计数器加1算法
输入:A[0..k−1]A[0..k-1]A[0..k−1],存储二进制数xxx
输出:A[0..k−1]A[0..k-1]A[0..k−1],存储二进制数x+1mod2kx+1 mod 2kx+1mod2k
INCREMENT(A)(1)i←0(2)whilei<kandA[i]=1Do(3)A[i]←0;(4)i←i+1;(5)Ifi<kThenA[i]←1INCREMENT(A)\\
(1) i\leftarrow 0\\
(2) while\quad i<k\quad and\quad A[i]=1\quad Do\\
(3) \quad A[i]\leftarrow 0;\\
(4)\quad i\leftarrow i+1;\\
(5) If\quad i<k\quad Then\quad A[i]\leftarrow 1INCREMENT(A)(1)i←0(2)whilei<kandA[i]=1Do(3)A[i]←0;(4)i←i+1;(5)Ifi<kThenA[i]←1
聚集方法:
(1)粗略分析:
每个IncrementIncrementIncrement的时间代价最多O(k)O(k)O(k),nnn个IncrementIncrementIncrement序列的时间代价最多O(kn)O(kn)O(kn),nnn个IncrementIncrementIncrement平摊代价为O(k)O(k)O(k)
(2)精细分析:
一般地,对于i=0,1,….,lgni=0, 1, …., lgni=0,1,….,lgn, A[i]A[i]A[i]改变次数为n/2in/2in/2i,对于i>lgni>lgni>lgn, A[i]A[i]A[i]不发生改变 (因为nnn个操作结果为nnn,仅涉及A[0]A[0]A[0]至A[lgn]A[lgn]A[lgn]位)T(n)=∑0≤i≤lgnn/2i<n∑0≤i<∞1/2i=2n=O(n)T(n)= \sum_{0\le i\le lgn}n/2i<n\sum_{0\le i<\infin}1/2^i= 2n=O(n)T(n)=∑0≤i≤lgnn/2i<n∑0≤i<∞1/2i=2n=O(n),每个IncrementIncrementIncrement操作的平摊代价为O(1)O(1)O(1)
会计方法:
每次一位被置1时,付2美元,1美元用于置1的开销 ,1美元存储在该“1”位上,用于支付其被置0时的开销 • 置0操作无需再付款Cost(Increment)=2Cost(Increment)=2Cost(Increment)=2,∑1≤i≤nαi−∑1≤i≤nci≥0\sum_{1\le i\le n}{\alpha_i}-\sum_{1\le i\le n}{c_i}\ge 0∑1≤i≤nαi−∑1≤i≤nci≥0就成立了∑1≤i≤nci≤2n\sum_{1\le i\le n}{c_i}\le 2n∑1≤i≤nci≤2n
势能方法:
ϕ(Dm)\phi(D_m)ϕ(Dm)定义为第mmm个操作后计数器中1的个数bmb_mbm,ϕ(D0)=0\phi(D_0)=0ϕ(D0)=0,D0D_0D0中1的个数为0,ϕ(Di)≥0=ϕ(D0)\phi(D_i)\ge 0=\phi(D_0)ϕ(Di)≥0=ϕ(D0), 因为计数器中1的个数不会小于0。INCREMENTINCREMENTINCREMENT操作的平摊代价,第iii个INCREMENTINCREMENTINCREMENT操作将tit_iti个1置0, 实际代价为ti+1t_i+1ti+1,计算操作iii的平摊代价αi=ci+ϕ(Di)−ϕ(Di−1)\alpha_i=c_i+\phi(D_i)-\phi(D_{i-1})αi=ci+ϕ(Di)−ϕ(Di−1) Ifbi=kIfb_i=kIfbi=k, 操作i就resetsi就resetsi就resets所有kkk位, 所以bi−1=ti=kb_{i-1}=t_i=kbi−1=ti=k,Ifbi>0,则bi=bi−1−ti+1If b_i>0, 则b_i=b_{i-1}-t_i+1Ifbi>0,则bi=bi−1−ti+1于是bi≤bi−1−ti+1;ϕ(Di)−ϕ(Di−1)=bi−bi−1≤bi−1−ti+1−bi−1=1−tib_i\le b_{i-1}-t_i+1;\phi(D_i)-\phi(D_{i-1})=b_i-b_{i-1}\le b_{i-1}-t_i+1-b_{i-1}=1-t_ibi≤bi−1−ti+1;ϕ(Di)−ϕ(Di−1)=bi−bi−1≤bi−1−ti+1−bi−1=1−ti平摊代价αi=ci+ϕ(Di)−(Di−1)≤(ti+1)+(1−ti)=2\alpha_i=c_i+\phi(D_i)-(D_{i-1})\le(t_i+1)+(1-t_i)=2αi=ci+ϕ(Di)−(Di−1)≤(ti+1)+(1−ti)=2
3.动态表的平摊分析
插入操作:TABLE—INSERT(T,x)(1)Ifsize[T]=0Then(2)获取一个大小为1的表table[T];(3)size[T]←1;(4)Ifnum[T]=size[T]Then(5)获取一个大小为2×size[T]的新表new−table;(6)将table[T]中元素插入new−table;(7)释放table[T];(8)table[T]←new−table;(9)size[T]←2×size[T];(10)将x插入table[T];(11)num[T]←num[T]+1TABLE—INSERT(T, x)\\ (1) If\quad size[T]=0\quad Then\\ (2) \quad\quad获取一个大小为1的表table[T];\\ (3) size[T]\leftarrow 1;\\ (4) If num[T]=size[T] Then\\ (5) \quad\quad获取一个大小为2\times size[T]的新表new-table;\\ (6) \quad\quad将 table[T]中元素插入new-table;\\ (7) \quad\quad释放 table[T];\\ (8) \quad\quad table[T]\leftarrow new-table;\\ (9) \quad\quad size[T]\leftarrow 2\times size[T];\\ (10) 将 x插入table[T];\\ (11) num[T]\leftarrow num[T]+1TABLE—INSERT(T,x)(1)Ifsize[T]=0Then(2)获取一个大小为1的表table[T];(3)size[T]←1;(4)Ifnum[T]=size[T]Then(5)获取一个大小为2×size[T]的新表new−table;(6)将table[T]中元素插入new−table;(7)释放table[T];(8)table[T]←new−table;(9)size[T]←2×size[T];(10)将x插入table[T];(11)num[T]←num[T]+1
聚集方法:
精细分析,第iii次操作的代价CiC_iCi,如果i−1=2mi - 1=2^mi−1=2m,Ci=iC_i=iCi=i;否则Ci=1C_i=1Ci=1;nnn次TABLE—INSERTTABLE—INSERTTABLE—INSERT操作的总代价为∑i=1nci≤n+∑j=1⌊logn⌋2j<n+2n=3n\sum_{i=1}^{n}c_i\le n+\sum_{j=1}^{\lfloor logn\rfloor}2^j<n+2n=3n∑i=1nci≤n+∑j=1⌊logn⌋2j<n+2n=3n
会计方法:
每次执行TABLE—INSERTTABLE—INSERTTABLE—INSERT平摊代价为3;1支付第11步中的基本插入操作的实际代价;1作为自身的存款;1存入表中第一个没有存款的数据上
势能方法:
ϕ(T)=2∗num[T]−size[T]\phi(T)=2*num[T]-size[T]ϕ(T)=2∗num[T]−size[T]第i次操作的平摊代价,如果发生扩张,ci=3c_i=3ci=3,如果未发生扩张, ci=0c_i=0ci=0
收缩操作:
改进的收缩策略(允许装载因子低于1/2 )满表中插入数据项时,将表扩大一倍;删除数据项引起表不足1/4满时,将表缩小为原表的一半;扩张和收缩过程都使得表的装载因子变为1/2;表的装载因子的下界是1/4
ϕ(T)=2⋅num[T]−size[T],α(T)≥1/2;size[T]/2−num[T],α[T]<1/2\phi(T)=2\cdot num[T]-size[T],\alpha(T)\ge 1/2;size[T]/2-num[T],\alpha[T]<1/2ϕ(T)=2⋅num[T]−size[T],α(T)≥1/2;size[T]/2−num[T],α[T]<1/2
作用于一动态表上的nnn个操作的实际时间为O(n)O(n)O(n)
4.斐波那契堆性能平摊分析
一系列树,每棵树均是一个极小堆;一个指针,指向最小元素; 一些标记顶点。用于保持堆的“扁平结构”;标记的具体含义是:xxx被标记,如果它以前是树根,但堆操作过程中变成其他结点的孩子且失去过孩子。
nnn : 堆HHH中数据元素的个数
rank(x)rank(x)rank(x) : 堆中结点xxx的孩子数
rank(H)rank(H)rank(H) : 堆HHH的所有结点中的最大孩子数
t(H)t(H)t(H) :堆HHH中树的棵数
mark(H)mark(H)mark(H) :堆HHH中被标记顶点的个数
ϕ(H)=t(H)+2⋅mark(H)\phi(H)=t(H)+2\cdot mark(H)ϕ(H)=t(H)+2⋅mark(H):势能函数
插入操作的过程:以新结点为根,创建一棵新树;将新的树插入树根双向链表;如有必要,更新最小元素指针,平摊代价O(1)O(1)O(1)
Delete_min操作过程:删除最小元素;将其所有孩子链入双向链表,更新最小元素指针,实际开销O(t(H)+rank(x))O(t(H)+rank(x))O(t(H)+rank(x));合并双向链表中的树根,使得没有树根具有相同rankrankrank。平摊代价$O(rank(H))$
键值减小操作:若减小键值后,堆性质仍成立,则仅需减小键值;否则, 将xxx子树剪切下来插入双向链表,若xxx的父结点ppp未标记,标记其父结点,否则,剪切ppp插入双向链表,将ppp置为未标记结点(递归过程)。实际开销O(c)O(c)O(c),平摊代价O(1)O(1)O(1),操作完成后的堆记为H′H'H′,操作前的堆记为HHH,t(H′)≤t(H)+ct(H' )\le t(H)+ct(H′)≤t(H)+c;mark(H′)=mark(H)−c+2mark(H')=mark(H)-c+2mark(H′)=mark(H)−c+2;Δϕ(H)=c+2(−c+2)=4−c\Delta\phi(H) =c+2(-c+2)=4-cΔϕ(H)=c+2(−c+2)=4−c
删除操作的平摊代价O(rank(H))O(rank(H))O(rank(H)):先将节点xxx的键值减小为−∞-\infin−∞,则xxx将出现在堆顶,平摊代价O(1)O(1)O(1);调用deletemindelete_mindeletemin删除堆顶元素,平摊代价O(rank(H))O(rank(H))O(rank(H))。
设xxx是斐波那契堆中的任意结点,记k=rank(x)k=rank(x)k=rank(x)。设y1,y2,...,yky_1,y_2,...,y_ky1,y2,...,yk是结点xxx的所有孩子结点且恰好按其成为xxx的孩子的先后次序列出,则rank(y1)≥0rank(y_1)\ge0rank(y1)≥0,且rank(yi)≥i−2rank(y_i)\ge i-2rank(yi)≥i−2对i=2,3,...,ki=2,3,...,ki=2,3,...,k成立
证明.当yiy_iyi成为xxx的孩子时, xxx已有孩子y1,y2,...,yi−1y_1,y_2,...,y_{i-1}y1,y2,...,yi−1,故rank(x)=i−1rank(x)=i-1rank(x)=i−1;yiy_iyi要成为xxx的孩子,需满足rank(yi)=rank(x)=i−1rank(y_i)=rank(x)=i-1rank(yi)=rank(x)=i−1
设xxx是斐波那契堆中的任意结点,记k=rank(x)k=rank(x)k=rank(x),则xxx所在的极小堆中至少有(1+52)k−2(\frac{1+\sqrt{5}}{2})^{k-2}(21+5)k−2个结点
证明:根据引理1,用归纳法统计xxx及其子孙结点的个数有sk=1+s0+s0+...+sk−2≥1+1+F(0)+F(1)+...+F(k−2)≥1+F(k)≥(1+52)k−2s_k=1+s_0+s_0+...+s_{k-2}\ge1+1+F(0)+F(1)+...+F(k-2)\ge1+F(k)\ge(\frac{1+\sqrt{5}}{2})^{k-2}sk=1+s0+s0+...+sk−2≥1+1+F(0)+F(1)+...+F(k−2)≥1+F(k)≥(21+5)k−2
设HHH是含有nnn个结点的斐波那契堆,则rank(H)=O(logn)rank(H)=O(logn)rank(H)=O(logn)
5.并查集性能平摊分析
MakeSet(x)MakeSet(x)MakeSet(x)操作执行时定义结点xxx的秩为0
FindFindFind操作不改变任意顶点的秩
Union(x,y)Union(x,y)Union(x,y)分两种情况修改结点的秩:情形aaa:rank(x)=rank(y)rank(x)=rank(y)rank(x)=rank(y)。此时,令xxx指向yyy且yyy是并集的代表元素,rank(y)rank(y)rank(y)增加1,rank(x)rank(x)rank(x)不变(其他结点的秩也保持不变);情形bbb:rank(x)<rank(y)rank(x)<rank(y)rank(x)<rank(y)。此时,令xxx指向yyy且yyy是并集的代表元素,rank(y)rank(y)rank(y)和rank(x)rank(x)rank(x)保持不变(其他结点的秩也保持不变)
UNION(x,y)(1)LINK(FIND(x),FIND(y))MAKE−SET(x)(1)rank[x]←0(2)p[x]←xFIND(x)(1)Q←∅(2)Whilex≠p[x]Do(3)将x插入Q;(4)x←p[x];(5)For∀y∈Qdo(6)p[y]←x;(7)输出xLINK(x,y)(1)ifrank[x]>rank[y]then(2)p[y]←x(3)elsep[x]←y(4)ifrank[x]=rank[y]then(5)rank[y]←rank[y]+1UNION(x,y)\\ (1) LINK(FIND(x),FIND(y))\\ MAKE-SET(x)\\ (1) rank[x]\leftarrow 0\\ (2) p[x]\leftarrow x\\ FIND(x)\\ (1) Q\leftarrow \emptyset\\ (2) While\quad x\ne p[x]\quad Do\\ (3) \quad 将x插入Q;\\ (4) \quad x\leftarrow p[x];\\ (5) For\quad \forall y\in Q\quad do\\ (6) \quad p[y]\leftarrow x;\\ (7) 输出x\\ LINK(x,y)\\ (1) if\quad rank[x]>rank[y]\quad then\\ (2) \quad p[y]\leftarrow x\\ (3) else\quad p[x]\leftarrow y\\ (4) if\quad rank[x]=rank[y]\quad then\\ (5) \quad rank[y] \leftarrow rank[y] +1UNION(x,y)(1)LINK(FIND(x),FIND(y))MAKE−SET(x)(1)rank[x]←0(2)p[x]←xFIND(x)(1)Q←∅(2)Whilex=p[x]Do(3)将x插入Q;(4)x←p[x];(5)For∀y∈Qdo(6)p[y]←x;(7)输出xLINK(x,y)(1)ifrank[x]>rank[y]then(2)p[y]←x(3)elsep[x]←y(4)ifrank[x]=rank[y]then(5)rank[y]←rank[y]+1
对于含有nnn个结点的并查集,秩具有如下性质:
(1) 如果x≠p(x)x\ne p(x)x=p(x),则rank(x)<rank(p(x))rank(x) < rank(p(x))rank(x)<rank(p(x))
(2) rank(x)rank(x)rank(x)的初始值为0,缓慢递增直到xxx不再是集合的代表 元素,此后保持不变
(3)对于任意xxx, rank(p(x))rank(p(x))rank(p(x))是在操作过程中单调缓慢递增
(4)rank(x)≤n−1rank(x)\le n-1rank(x)≤n−1对任意结点成立
阿克曼函数是定义在k≥0,j≥1k\ge0, j\ge1k≥0,j≥1上的递归函数
Ak(j)={j+1如果k=0Ak−1(j+1)(j)如果k≥1A_k(j)=\left\{
\begin{array}{rcl}
j+1 & & {如果k=0}\\
A_{k-1}^{(j+1)}(j) & & {如果k\ge1}
\end{array} \right.Ak(j)={j+1Ak−1(j+1)(j)如果k=0如果k≥1
kkk层, 层越大,增长越快;jjj迭代次数,迭代次数越大,增长越快
阿克曼函数的逆函数定义为α(n)=min{k∣Ak(1)≥n}\alpha(n) =min \{k | A_k(1)\ge n\}α(n)=min{k∣Ak(1)≥n}
对并查集中的每个结点xxx,定义
Level(x)=max{k∣rank(p(x))≥Ak(rank(x))}Level(x) = max\{k | rank(p(x)) \ge A_k(rank(x))\}Level(x)=max{k∣rank(p(x))≥Ak(rank(x))}
Iter(x)=max{i∣ALeve(x)(i)(rank(x))≤rank(p(x))}Iter(x) = max\{i | A_{Leve(x)}^{(i)}(rank(x))\le rank(p(x))\}Iter(x)=max{i∣ALeve(x)(i)(rank(x))≤rank(p(x))}
0≤Level(x)<α(n)0\le Level(x)<\alpha(n)0≤Level(x)<α(n), 且Level(x)Level(x)Level(x)随时间递增
1≤Iter(x)≤rank(x)1\le Iter(x)\le rank(x)1≤Iter(x)≤rank(x), 且只要Level(x)Level(x)Level(x)不变则Iter(x)Iter(x)Iter(x)不变或增大
只要Level(x)Level(x)Level(x)不变则Iter(x)Iter(x)Iter(x)不变或增大
ϕq(x)={α(n)⋅rank(x)若x是树根或者rank(x)=0[α(n)−Level(x)]⋅rank(x)−Iter(x)若x不是树根且rank(x)≥0\phi_q(x)=\left\{
\begin{array}{rcl}
\alpha(n)\cdot rank(x) & & {若x是树根或者rank(x)=0}\\
[\alpha(n)-Level(x)]\cdot rank(x)-Iter(x) & & {若x不是树根且rank(x)\ge0}
\end{array} \right.ϕq(x)={α(n)⋅rank(x)[α(n)−Level(x)]⋅rank(x)−Iter(x)若x是树根或者rank(x)=0若x不是树根且rank(x)≥0
0≤ϕq(x)≤α(n)rank(x)0\le\phi_q(x)\le\alpha(n)rank(x)0≤ϕq(x)≤α(n)rank(x)
若xxx不是树根,第q+1q+1q+1个操作是UnionUnionUnion或FindFindFind,则ϕq+1(x)≤ϕq(x)\phi_{q+1}(x)\le\phi_q(x)ϕq+1(x)≤ϕq(x)
Make_SetMake\_SetMake_Set操作的平摊代价为O(1)O(1)O(1)
Union(y,z)Union(y,z)Union(y,z)操作的平摊代价为Θ(α(n))\Theta(\alpha(n))Θ(α(n))
Find(x)Find(x)Find(x)操作的平摊代价为Θ(α(n))\Theta(\alpha(n))Θ(α(n))
在并查集上执行m个操作的时间复杂度为O(mα(n))O(m\alpha(n))O(mα(n))
参考:哈工大算法设计与分析PPT
本文深入探讨了平摊分析的三种核心方法:聚集方法、会计方法和势能方法,通过具体实例如栈操作、计数器加1算法、动态表、斐波那契堆及并查集的性能分析,详细解析了如何计算算法的平均时间复杂度。

3087

被折叠的 条评论
为什么被折叠?



