自组织表(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