《算法导论》:竞争性分析、自组织表

自组织表(Self-Organizing List)

两种基本操作

access(x):访问元素x,时间复杂度与x在表中的位置即rank(x)成正相关

transpose(x):交换x和x的前驱,时间复杂度为O(1)。

两种算法

在线算法:必须立即完成这步操作,无法预知后续操作。

离线算法(上帝算法):离线算法可以假设可以预读整个序列,从而可以对整个操作序列做优化。

算法分析

最坏情况:用在线算法使用自组织表,对手每次都可能让我们访问最后一个元素,因此最坏时间为O(n*|S|),即表长乘操作序列的个数。

平均情况:元素x被访问的概率为P(x),则代价的期望为:∑P(x) * rank(x)。

前移思想及其应用(Move To Front)

前移思想(MTF):access(x)之后,循环调用transpose(x),将x移动至表头。

应用:对于搜索的“流行词”可能会有比较好的反应,因为在一个时期,流行词被搜索的次数会增加,而一旦过了流行期间,其位置可能就被新的流行词替代了。这对于操作序列S的局部反映非常好。对于高速缓存等其他情况下也可能用到。

竞争分析

定义

一个在线算法是α竞争的:如果存在一个常数k,对于任何的操作序列S,满足 C(S) ≤ α * Copt(S) + k。对a的限定不依赖于任何输入,也不依赖于任何概率假设。

定理

前移启发式自组织表MTF是4竞争的。

证明*

势能函数的性质

a. Φ = L相对于L*的逆序对的数量 × 2

b. Φ(Li) ≥ 0,Φ(L0) = 0(如果L0与L*0相同)

c. 一次transpose(x)操作,ΔΦ = ± 2.

access(x)后会发生什么?

根据x在Li和Li*中的位置,将Li中的元素分为四个集合。

A={y| y为Li中的元素,在Li中y在x前面,且在Li*中y在x前面}

B={y| y为Li中的元素,在Li中y在x前面,且在Li*中y在x后面}

C={y| y为Li中的元素,在Li中y在x后面,且在Li*中y在x前面}

D={y| y为Li中的元素,在Li中y在x后面,且在Li*中y在x后面}

直观上:

r=|A|+|B|+1,r*=|A|+|C|+1

Assess(x)后,集合A将与x逆序,而集合B与x的逆序被消除。与此同时,最优表将进行ti次transpose操作,因此:

ΔΦ ≤ 2(|A|-|B|+ti)

由势能方法分析,第i次操作

ci^ = ci + ΔΦ ≤ 2r + 2(|A|-|B|+ti)

= 2r + 2(|A|-r+|A|+1+ti)-----------------------------------(由r定义替换|B|)

= 4|A| + 2 + 2ti

≤ 4(r*-1) + 2 - 2ti = 4(r* + ti) - 2(1 + ti)----------------(由r*定义,则r*>=|A|+1)

≤ 4(r*+ti)--------------------------(由ti为正负1则1+ti>=0)

= 4ci*------------------------------(由c*定义)

则MTF总的代价为各次代价的和:

Cmtf(S) = c1+…+cn 

=c1^ +…+ cn^ + Φ(L0) - Φ(Ln)

≤ 4(c1*+…+cn*)

= 4Copt(S)

得证!

竞争分析的说明与拓展

L0和L0*不相等

如果表的开始的势不为0,即L0和L0*不相等,最差情况为和L0*比是反序的,这样逆序数为C(n, 2) = O(n²).

这时候Cmtf(S) = 4Copt(S) + O(n²),其中O(n²)为常量级别,算法仍为4竞争的

指针操作移至表头

b.如果数据用链表表示,则从x位置移动到表头的操作只需要常数时间,此时可以证明相应的MTF则为2竞争的。

参考资料

http://open.163.com/movie/2010/12/I/2/M6UTT5U0I_M6V2U1BI2.html

https://blog.csdn.net/onyheart/article/details/16331219

发布了91 篇原创文章 · 获赞 142 · 访问量 9万+

猜你喜欢

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