算法设计与分析——平摊分析

本文深入探讨了平摊分析的三种核心方法:聚集方法、会计方法和势能方法,通过具体实例如栈操作、计数器加1算法、动态表、斐波那契堆及并查集的性能分析,详细解析了如何计算算法的平均时间复杂度。

基本思想(聚集方法需要精细分析,会计方法需要一步一步猜,势能方法需要构思势能函数)

聚集方法:分析整体的时间复杂度,每一步都假设代价相同,然后除以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 01inαi1inci0必须对于任意nnn个操作序列都成立

势能方法:为不同的操作赋予不同的代价,然后对整个问题分析代价
考虑在初始数据结构D0D_0D0上执行nnn个操作,对于操作iii,操作iii的实际代价为cic_ici,操作iii将数据结构Di−1D_{i-1}Di1变为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})αici+ϕ(Di)ϕ(Di1)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αii=1n(ci+ϕ(Di)ϕ(Di1))=i=1nci+ϕ(Dn)ϕ(D0)

基本例题

1.栈的操作

操作Multipop(S,k)Multipop(S, k)Multipop(S,k): 去掉SSSkkk个顶对象, 当∣S∣<k|S|<kS<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)WhilenotSTACKEMPTY(S)andk=0Do(2)Pop(S);(3)kk1.
假设PopPopPop的代价是1,那么Multipop(S,k)Multipop(S, k)Multipop(S,k)的代价就是min{∣S∣,k}min\{|S|,k\}min{S,k}

初始栈为空的nnn个栈操作序列的分析nnn个栈操作序列由PushPushPushPopPopPopMultipopMultipopMultipop组成

聚集方法:
(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)/nO(n)
(2)精细分析:一个对象在每次被压入栈后至多被弹出一次,在非空栈上调用PopPopPop的次数(包括在MultipopMultipopMultipop内的调用)至多为PushPushPush执行的次数, 即至多为nnn,最坏情况下操作序列的代价为T(n)≤2n=O(n)T(n)\le 2n=O(n)T(n)2nO(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)=0Cost(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 01inαi1inci0就成立了

势能方法:
ϕ(Dm)\phi(D_m)ϕ(Dm)定义为栈DmD_mDm中对象的个数,ϕ(D0)=0\phi(D_0)=0ϕ(D0)0D0D_0D0是空栈 ϕ(Di)≥0=ϕ(D0)\phi(D_i)\ge 0=\phi(D_0)ϕ(Di)0=ϕ(D0), 因为栈中对象个数不会小于0。栈操作的平摊代价(设栈Di−1D_{i-1}Di1中具有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)ϕ(Di1)=1+(s+1)s=2POP:α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)ϕ(Di1)=1+(s1)s=0MULTIPOP(S,k)MULTIPOP(S, k)MULTIPOP(S,k): 设k′=min(k,s)k'=min(k,s)kmin(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)ϕ(Di1)=k+(sk)s=kk=0

2.计数器加1算法

输入:A[0..k−1]A[0..k-1]A[0..k1],存储二进制数xxx
输出:A[0..k−1]A[0..k-1]A[0..k1],存储二进制数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)i0(2)whilei<kandA[i]=1Do(3)A[i]0;(4)ii+1;(5)Ifi<kThenA[i]1

聚集方法:
(1)粗略分析:
每个IncrementIncrementIncrement的时间代价最多O(k)O(k)O(k)nnnIncrementIncrementIncrement序列的时间代价最多O(kn)O(kn)O(kn)nnnIncrementIncrementIncrement平摊代价为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)=0ilgnn/2i<n0i<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 01inαi1inci0就成立了∑1≤i≤nci≤2n\sum_{1\le i\le n}{c_i}\le 2n1inci2n

势能方法:
ϕ(Dm)\phi(D_m)ϕ(Dm)定义为第mmm个操作后计数器中1的个数bmb_mbmϕ(D0)=0\phi(D_0)=0ϕ(D0)0D0D_0D0中1的个数为0,ϕ(Di)≥0=ϕ(D0)\phi(D_i)\ge 0=\phi(D_0)ϕ(Di)0=ϕ(D0), 因为计数器中1的个数不会小于0。INCREMENTINCREMENTINCREMENT操作的平摊代价,第iiiINCREMENTINCREMENTINCREMENT操作将tit_iti个1置0, 实际代价为ti+1t_i+1ti1,计算操作iii的平摊代价αi=ci+ϕ(Di)−ϕ(Di−1)\alpha_i=c_i+\phi(D_i)-\phi(D_{i-1})αi=ci+ϕ(Di)ϕ(Di1) Ifbi=kIfb_i=kIfbik, 操作i就resetsi就resetsiresets所有kkk位, 所以bi−1=ti=kb_{i-1}=t_i=kbi1=ti=kIfbi>0,则bi=bi−1−ti+1If b_i>0, 则b_i=b_{i-1}-t_i+1Ifbi>0,bibi1ti+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_ibibi1ti+1;ϕ(Di)ϕ(Di1)=bibi1bi1ti+1bi1=1ti平摊代价α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)(Di1)(ti+1)+(1ti)=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]+1TABLEINSERT(T,x)(1)Ifsize[T]=0Then(2)1table[T];(3)size[T]1;(4)Ifnum[T]=size[T]Then(5)2×size[T]newtable;(6)table[T]newtable;(7)table[T];(8)table[T]newtable;(9)size[T]2×size[T];(10)xtable[T];(11)num[T]num[T]+1

聚集方法:
精细分析,第iii次操作的代价CiC_iCi,如果i−1=2mi - 1=2^mi1=2mCi=iC_i=iCi=i;否则Ci=1C_i=1Ci=1nnnTABLE—INSERTTABLE—INSERTTABLEINSERT操作的总代价为∑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=3ni=1ncin+j=1logn2j<n+2n=3n

会计方法:
每次执行TABLE—INSERTTABLE—INSERTTABLEINSERT平摊代价为3;1支付第11步中的基本插入操作的实际代价;1作为自身的存款;1存入表中第一个没有存款的数据上

势能方法:
ϕ(T)=2∗num[T]−size[T]\phi(T)=2*num[T]-size[T]ϕ(T)=2num[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)=2num[T]size[T],α(T)1/2;size[T]/2num[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)+2mark(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,操作前的堆记为HHHt(H′)≤t(H)+ct(H' )\le t(H)+ct(H)t(H)+cmark(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)=4c

删除操作的平摊代价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)i2i=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,...,yi1,故rank(x)=i−1rank(x)=i-1rank(x)=i1;yiy_iyi要成为xxx的孩子,需满足rank(yi)=rank(x)=i−1rank(y_i)=rank(x)=i-1rank(yi)=rank(x)=i1

xxx是斐波那契堆中的任意结点,记k=rank(x)k=rank(x)k=rank(x),则xxx所在的极小堆中至少有(1+52)k−2(\frac{1+\sqrt{5}}{2})^{k-2}(21+5)k2个结点

证明:根据引理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+...+sk21+1+F(0)+F(1)+...+F(k2)1+F(k)(21+5)k2

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)分两种情况修改结点的秩:情形aaarank(x)=rank(y)rank(x)=rank(y)rank(x)=rank(y)。此时,令xxx指向yyyyyy是并集的代表元素,rank(y)rank(y)rank(y)增加1,rank(x)rank(x)rank(x)不变(其他结点的秩也保持不变);情形bbbrank(x)<rank(y)rank(x)<rank(y)rank(x)<rank(y)。此时,令xxx指向yyyyyy是并集的代表元素,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))MAKESET(x)(1)rank[x]0(2)p[x]xFIND(x)(1)Q(2)Whilex=p[x]Do(3)xQ;(4)xp[x](5)ForyQdo(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)n1对任意结点成立

阿克曼函数是定义在k≥0,j≥1k\ge0, j\ge1k0,j1上的递归函数
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+1Ak1(j+1)(j)k=0k1
kkk层, 层越大,增长越快;jjj迭代次数,迭代次数越大,增长越快

阿克曼函数的逆函数定义为α(n)=min{k∣Ak(1)≥n}\alpha(n) =min \{k | A_k(1)\ge n\}α(n)=min{kAk(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{krank(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{iALeve(x)(i)(rank(x))rank(p(x))}
0≤Level(x)<α(n)0\le Level(x)<\alpha(n)0Level(x)<α(n), 且Level(x)Level(x)Level(x)随时间递增
1≤Iter(x)≤rank(x)1\le Iter(x)\le rank(x)1Iter(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)xrank(x)=0xrank(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个操作是UnionUnionUnionFindFindFind,则ϕ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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值