算法笔记——随机化算法舍伍德Sherwood算法和线性时间选择问题_第1页
算法笔记——随机化算法舍伍德Sherwood算法和线性时间选择问题_第2页
算法笔记——随机化算法舍伍德Sherwood算法和线性时间选择问题_第3页
算法笔记——随机化算法舍伍德Sherwood算法和线性时间选择问题_第4页
算法笔记——随机化算法舍伍德Sherwood算法和线性时间选择问题_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1、舍伍德(Sherwood)算法     设A是一个确定性算法,当它的输入实例为x时所需的计算时间记为tA(x)。设Xn是算法A的输入规模为n的实例的全体,则当问题的输入规模为n时,算法A所需的平均时间为。这显然不能排除存在xXn使得的可能性。希望获得一个随机化算法B,使得对问题的输入规模为n的每一个实例均有。这就是舍伍德算法设计的基本思想。当s(n)与tA(n)相比可忽略时,舍伍德算法可获得很好的平均性能。     2、线性时间选择算法     1)随机划分选择基准    

2、0;对于选择问题而言,用拟中位数作为划分基准可以保证在最坏的情况下用线性时间完成选择。如果只简单地用待划分数组的第一个元素作为划分基准,则算法的平均性能较好,而在最坏的情况下需要O(n2)计算时间。舍伍德选择算法则随机地选择一个数组元素作为划分基准,这样既保证算法的线性时间平均性能,又避免了计算拟中位数的麻烦。非递归的舍伍德型选择算法如下:cpp view plain copy1. /随机化算法 线性时间选择 随机划分选择基准  2. #include "stdafx.h"  3. #

3、include "RandomNumber.h"  4. #include <iostream>  5. using namespace std;  6.   7. template<class Type>  8. Type select(Type a,int l,int r,int k);  9.   10. t

4、emplate<class Type>  11. Type select(Type a,int n,int k);  12.   13. template <class Type>  14. inline void Swap(Type &a,Type &b);  15.   16. int main() &#

5、160;17.   18.     int a = 5,7,3,4,8,6,9,1,2;    19.     cout<<"原数组为:"<<endl;  20.     for(int i=0; i<9; i+)    21.  

6、0;      22.         cout<<ai<<" "    23.         24.     cout<<endl;    25.    

7、60;cout<<"所给数组第7小元素为:"<<select(a,9,7)<<endl;    26.     return 0;  27.   28.   29. /计算a0:n-1中第k小元素  30. /假设an是一个键值无穷大的元素  31. template<class Type>  32. Type

8、 select(Type a,int n,int k)  33.   34.     if(k<1 | k>n)  35.       36.         cout<<"请输入正确的k!"<<endl;  37. 

9、60;       return 0;  38.       39.     return select(a,0,n-1,k);  40.   41.   42. /计算al:r中第k小元素  43. template<class Type>  44. Type

10、60;select(Type a,int l,int r,int k)  45.   46.     static RandomNumber rnd;  47.     while(true)  48.       49.         

11、if(l>=r)  50.           51.             return al;  52.           53.   54.     &#

12、160;   int i = l,  55.             j = l + rnd.Random(r-l+1);/随机选择划分基准  56.   57.         Swap(ai,aj);  58. &#

13、160; 59.         j = r+1;  60.         Type pivot = al;  61.   62.         /以划分基准为轴做元素交换  63.   

14、0;     while(true)  64.           65.             while(a+i<pivot);  66.            

15、60;while(a-j>pivot);  67.             if(i>=j)  68.               69.             &#

16、160;   break;  70.               71.             Swap(ai,aj);  72.           73. 

17、0; 74.         if(j-l+1 = k)/第k小  75.           76.             return pivot;  77.     

18、60;     78.   79.         /aj必然小于pivot,做最后一次交换,满足左侧比pivot小,右侧比pivot大  80.         al = aj;  81.         aj =&#

19、160;pivot;  82.   83.         /对子数组重复划分过程  84.         if(j-l+1<k)  85.           86.        

20、;     k = k-j+l-1;/右侧:k-(j-l+1)=k-j+l-1  87.             l = j + 1;  88.           89.     

21、0;   else  90.           91.             r = j - 1;  92.           93.   &#

22、160;   94.   95.   96. template <class Type>  97. inline void Swap(Type &a,Type &b)  98.   99.     Type temp = a;  100.     a&

23、#160;= b;  101.     b = temp;  102.        程序运行结果如图:     2)随机洗牌预处理      有时也会遇到这样的情况,即所给的确定性算法无法直接改造成舍伍德型算法。此时可借助于随机预处理技术,不改变原有的确定性算法,仅对其输入进行随机洗牌,同样可收到舍伍德算法的效果。例如,对于确定性选择算法,可以用下面的洗牌算法shu

24、ffle将数组a中元素随机排列,然后用确定性选择算法求解。这样做所收到的效果与舍伍德型算法的效果是一样的。cpp view plain copy1. /随机化算法 线性时间选择 输入预处理,洗牌  2. #include "stdafx.h"  3. #include "RandomNumber.h"  4. #include <iostream>  5. using namespac

25、e std;  6.   7. template<class Type>  8. Type select(Type a,int l,int r,int k);  9.   10. template<class Type>  11. Type select(Type a,int n,int k);  12. 

26、0; 13. template<class Type>  14. void Shuffle(Type a,int n);  15.   16. template <class Type>  17. inline void Swap(Type &a,Type &b);  18.   19. int main() 

27、; 20.   21.     int a = 5,7,3,4,8,6,9,1,2;    22.     cout<<"原数组为:"<<endl;  23.     for(int i=0; i<9; i+)    24.  &

28、#160;      25.         cout<<ai<<" "    26.         27.     cout<<endl;   28.     

29、Shuffle(a,9);/洗牌  29.     cout<<"洗牌后数组为:"<<endl;  30.     for(int i=0; i<9; i+)    31.         32.        

30、; cout<<ai<<" "    33.         34.     cout<<endl;    35.     cout<<"所给数组第7小元素为:"<<select(a,9,7)<<endl;  

31、;  36.     return 0;  37.   38.   39. /计算a0:n-1中第k小元素  40. /假设an是一个键值无穷大的元素  41. template<class Type>  42. Type select(Type a,int n,int k)  43.   44. 

32、0;   if(k<1 | k>n)  45.       46.         cout<<"请输入正确的k!"<<endl;  47.         return 0;  48.  &#

33、160;    49.     return select(a,0,n-1,k);  50.   51.   52. /计算al:r中第k小元素  53. template<class Type>  54. Type select(Type a,int l,int r,int k)  55.   

34、56.     while(true)  57.       58.         if(l>=r)  59.           60.            

35、 return al;  61.           62.         int i = l;  63.         int j = r+1;  64.    &

36、#160;    Type pivot = al;  65.   66.         /以划分基准为轴做元素交换  67.         while(true)  68.          &#

37、160;69.             while(a+i<pivot);  70.             while(a-j>pivot);  71.             if(i

38、>=j)  72.               73.                 break;  74.             

39、;  75.             Swap(ai,aj);  76.           77.   78.         if(j-l+1 = k)/第k小  79.   

40、        80.             return pivot;  81.           82.   83.         /aj必然小于pivot,做

41、最后一次交换,满足左侧比pivot小,右侧比pivot大  84.         al = aj;  85.         aj = pivot;  86.   87.         /对子数组重复划分过程  88

42、.         if(j-l+1<k)  89.           90.             k = k-j+l-1;/右侧:k-(j-l+1)=k-j+l-1  91.             l = j + 1;  92.    

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论