竟争分析_MTF算法

来源:互联网 发布:魔法王座神器7上8数据 编辑:程序博客网 时间:2024/06/10 08:13

1.自组织表

在介绍竟争分析前,我首先介绍一下自组织表,竟争分析就是在自组织表基础下进行分析的。
对于一个有n个元素的列表,从中查找一个元素,查找所要的时间与该元素的位置有关??我们就需要设计一个算法,对列表进行优化,使查找所需要的时间复杂度最小。
对于一个操作序列,列表优化有两种:
(1)在线优化:我们不知道下一个查找的元素,对序列进行优化。
(2)离线优化:我们已经预知了所有查找的元素,根据这来对序列进行优化。
这两种优化都是使查找所需的时间复杂度最小。
自组织表的元素被访问后,该元素再次被访问的概率就会变大,可以将该元素与其前驱相置换(即将该元素放到列表开头),这样就可以减少下次访问的时间。

2.竞争分析

在进行竞争分析前,我们首先要明白分析什么??当然对于一个算法,通常就是时间复杂度和空间复杂度的分析。我们这里的分析是时间复杂度的分析。一般而言,分析时间复杂度都是求算法时间复杂度的上限,即最坏情况分析,同样我们也来分析一波。
我们的算法是将访问的元素放到列表最前面,如果你是竞争者,你会以怎样的访问顺序来访问该列表,使该列表的查找所耗的时间最长。当然是选择该列表的逆序进行访问,这样算法的时间复杂度就是O(S*N),S代表你的访问次数,N代表列表的元素。对于一个在线算法,最坏情况不可避免,所以分析该算法的平均复杂度或许意义更大一些。
下面我们来分析一下该算法的平均复杂度!
竞争分析的定义是:在线算法A是 的竞争,对于满足任意操作的序列S,运行A算法,,其中Copt(s)代表离线最优算法的复杂度,可能是函数或者常量。
定理:自组织表中的MTF算法,是四竞争的。(即不管选择多么糟糕,都不操作4)
下面来对这个定理进行证明:
定义1:设Li表示第i次访问后优化的MTF表,设L_i表示离线算法第i次后的最优表。
定义2:设Ci表示MTF算法第i次操作的时间代价,为x在L(i-1)中位置的两倍(找到该x元素需要rank(x),将x平移到最前面需要rank(x),所以需要2rank(x));C_i表示最优表第i次操作的时间代价,为x在L_i中位置的位置加上ti,ti表示最优表做了ti次替换(最优表x元素需要进行x次置换)。
分析一个算法的平均时间复杂度,我们一般用平摊分析的势能法进行分析,首先我们构造一个势能方程,这个势能方程是
=2*(逆序对)
举个例子:
Li=->E->C->A->D->B
L_i=->C->A->B->D->E
   =2*5=10
由势能方程的定义可知:
现在考虑另外一个问题,加入对上述例子中一个元素的位置发生变化,势能方程的值会改变多少??答案是会产生或者消除一个逆序对,即
下面定义四个集合如下:
图来表示就是这样:
r=rank(x)代表MTF算法下x在第i-1次置换后列表的位置,r1=rank(x)代表x在最优表中i-1次操作后的位置。则有r=|A|+|B|+1,r1=|A|+|C|+1;那么如果将x移到最前面会产生多少逆序列??逆序对=|A|-|B|,而最优表会进行ti次置换,每次置换会产生或消除一对逆序对,故可以得到:
ti表示最优表在第i次操作置换的次数。
势能分析:
整体性能分析:
上面式子可以看出,在线算法就整体性能而言,不超过离线最优算法的4倍。简直太优秀了。


原创粉丝点击