版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 动车组机械师安全综合考核试卷含答案
- 伺服电机巡检手册
- kj探究电阻上电流跟两端电压关系
- 缩醛化药液配制工诚信竞赛考核试卷含答案
- 人工智能训练师安全实操能力考核试卷含答案
- 2026中冶建筑研究总院限公司校园招聘156人易考易错模拟试题(共500题)试卷后附参考答案
- CE认证培训资料
- 化纤组件清理工岗前综合考核试卷含答案
- 2026下半年浙江舟山市委党校招聘事业单位工作人员3人易考易错模拟试题(共500题)试卷后附参考答案
- 工业危险废物处理工健康知识强化考核试卷含答案
- 2026年比亚迪保养及保修手册
- 电网特种作业人员持证参考目录
- 《第一章 人体的内环境与稳态》课件
- 河南省鹤壁市重点学校小升初入学分班考试语文考试试题及答案
- 中暑急救新进展与新技术
- 低温等离子体和脉冲电场灭菌技术
- 铁路专用线设计规范(试行)(TB 10638-2019)
- 培训课件 -华为铁三角工作法完全解密
- 生猪屠宰场突发环境事件应急预案
- 河南豫膜环保科技有限公司年产200万平方米中空纤维膜及配套设备项目环境影响报告
- 安徽敬同药业公司抗癌类药物研发项目环境影响报告表
评论
0/150
提交评论