zoukankan      html  css  js  c++  java
  • 概率算法sherwood算法

    个人认为sherwood算法严格意义上不是一个算法,而是一个随机处理过程,我将原始算法经过sherwood处理后的算法称为sherwood算法。使用Sherwood处理后的算法能够平滑不同输入实例的执行时间。

    A是一个确定算法,f(x)是解某个实例x的执行时间,设n是一整数,Xn是大小为n的实例的集合.假定Xn中每一个实例是等可能出现的,则算法A解一个大小为n的实例的平均执行时间是:

    这时使用sherwood对原始算法进行改进是有价值的。Sherwood算法通过增加一个较小的额外开销从而使得算法的复杂度与具体实例x无关,虽然此时的算法仍有可能发生复杂度比较大的情况,但这种偶然行行为只是由于算法所做的概率选择引起的。我们可以通过多次执行算法来避免最差情况。

    那么是不是所有算法都可以使用sherwood进行处理,其一般处理方法是什么。

    事实上几乎所有查找与排序算法都可以使用sherwood算法进行处理,排序算法在执行排序之前对数据进行随机打乱就是一个典型的方法。某些有序表的查找也可以在查找前随机找一个数进行比较,从而使算法具有较好的平均性能。

    但不是每个算法都可以用sherwood处理,也不是每一个算法用sherwood处理都有意义,每个sherwood过程可能都不同。

    下面给出一个特殊有序静态链表以及它的一个查找sherwood算法。

    数据结构:

    这个有序静态链表由两个数组val[1..n]和ptr[1..n]及head构成。

    val[]中存的静态链表的数据,ptr[]中存的是所有val数组的下标,相当于单链表中的指针。head给出第一个结点的数组下标,即val[head]是第一个数据,同时head给出下一个数据地址的地址,即ptr[i]是第二个结点的下标,val[ptr[i]]是第2个数据。第i个数据小于第i+1个数据。

    初始算法:

    已知一个复杂度为的查找算法(注本算法不考虑查找数据不存在的情况,如要考虑则需修改)伪代码如下:

     1 Search(x, i) {    
    2 while x > val[i] do
    3 i ← ptr[i];
    4 return i;
    5 }
    6 B(x) { //设x在val[1..n]中
    7 i ← head;
    8 max ← val[i]; // max初值是表val中最小值
    9 for j ← 1 to 根号n的下界 do { // 在val的前 根号n 个数中找不大于x
    10 y ← val[ j ]; // 的最大整数y相应的下标i
    11 if max < y ≤x then {
    12 i ← j;
    13 max ← y;
    14 } //endif
    15 } // endfor
    16 return Search(x, i); // 从y开始继续搜索
    17 }

     算法复杂度简要证明:

    已知静态链表是有序的即val[head]<=val[ptr[head]]<=val[ptr[ptr[head]]]<=...

    将val[]等分为L个区间,val[]数组中的数可以看成是近似服从均匀分布,那么选L个数的话平均每个区间都有一个数被选到。从这L个被选中的数中找一个小于x(x是待查找数)的最大的数y,可以证明x必落入y所在的区间。从y开始遍历该表即可查到。总的时间复杂度为L+n/L,当L=n/L即L=根号n时,算法性能最优 为O(根号n)。

    sherwood改进算法

    结合算法复杂度分析和伪代码 我们知道,这L个数的选取是直接取了val[]数组的前L个,在最差情况下这L个数碰巧都相连着,由于L=n/L,它们刚好可以构成一组,如果他们是第一组,要查找的数是数据源中最大的,那么比较次数为n-L近似于O(n)了。此时如何使用sherwood思想对算法进行改进,使得L个数据的分布情况与原始数据无关就显得很有必要。一种sherwood改进算法是从val[] n个数据中随机的选取L个数据,其它部分相同。

    具体实现方法可以是从n个数据中随机选取L个(重复没关系,可以适当增加选取的个数),记录它们中小于x的最大的数的下标即可,设为i。那么从value[ptr[i]]开始查找就可以了。

    总结

    sherwood是一种概率算法思想,使得算法的复杂度不依赖于实例,而是依赖于概率。

    但是它没有提升算法的平均性能,按理说所有存在性能相差较大实例的算法都有使用sherwood进行改进的价值,但个人认为也全不如此,在sherwood处理后算法的性能好坏完全是概率事件,如果较差性能(依然存在)发生的概率较大或者说不可控,那么即便改进了又有什么意义呢。这个概率可以从理论上进行分析,麻烦的话也可以从实际出发,将改进后的算法与原始算法进行对比。 

  • 相关阅读:
    array_map()与array_shift()搭配使用 PK array_column()函数
    Educational Codeforces Round 8 D. Magic Numbers
    hdu 1171 Big Event in HDU
    hdu 2844 poj 1742 Coins
    hdu 3591 The trouble of Xiaoqian
    hdu 2079 选课时间
    hdu 2191 珍惜现在,感恩生活 多重背包入门题
    hdu 5429 Geometric Progression 高精度浮点数(java版本)
    【BZOJ】1002: [FJOI2007]轮状病毒 递推+高精度
    hdu::1002 A + B Problem II
  • 原文地址:https://www.cnblogs.com/2010Freeze/p/2181016.html
Copyright © 2011-2022 走看看