- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第九章 随机算法
算法的特征:确定性。算法对所有可能的输入,都必须能够得到正确的答案。
很多确定性的算法,其性能很坏。
用随机选择的方法来改善算法的性能。
某些方面可能不正确,对特定的输入,算法的每一次运行不一定得到相同结果。
出现这种不正确的可能性很小,以致可以安全地不予理睬。
9.1 随机算法引言
解问题的随机算法定义为:设是问题的一个实例,用算法解的某些时刻,随机选取,由来决定算法的下一步动作。
优点:1、执行时间和空间,小于同一问题的已知最好的确定性算法;
2、实现比较简单,容易理解。
9.1.1 随机算法的类型
一、类型:数值概率算法、拉斯维加斯(Las Vegas)算法、蒙特卡罗(Monte Carlo)算法、
及舍伍德(Sherwood)算法。
1、数值概率算法:用于数值问题的求解。所得到的解几乎都是近似解,近似解的精度随着计算时间的增加而不断地提高。
2、拉斯维加斯算法:要么给出问题的正确答案,要么得不到答案。反复求解多次,可使失效的概率任意小。
3、蒙特卡罗算法:总能得到问题的答案,偶然产生不正确的答案。重复运行,每一次都进行随机选择,可使不正确答案的概率变得任意小。
4、舍伍德算法:很多具有很好的平均运行时间的确定性算法,在最坏的情况下性能很坏。引入随机性加以改造,可以消除或减少一般情况和最坏情况的差别。
二、时间复杂性的衡量
衡量确定性算法的时间复杂性,是取它的平均运行时间。
衡量随机算法的时间复杂性,是对确定实例的期望运行时间,即反复地运行实例,所取的平均运行时间。
在随机算法里,所讨论的是最坏情况下的期望时间,和平均情况下的期望时间。
9.1.2 随机数发生器
一、产生随机数的公式:
(9.1.1)
产生0~65535的随机数序列,
、、为正整数,称为所产生的随机序列的种子。
常数、,对所产生的随机序列的随机性能有很大的关系,通常取一素数。
二、随机数发生器
函数random_seed提供给用户选择随机数的种子,
函数random计算新的种子,并产生一个范围为的新的随机数。
#define MULTIPLIER 0x015A4E35L;
#define INCREMENT 1;
static unsigned long seed;
void random_seed(unsigned long d)
{
if (d==0)
seed = time(0);
else
seed = d;
}
unsigned int random(unsigned long low,unsigned long high)
{
seed = MULTIPLIER * seed + INCREMENT;
return ((seed 16) % (high – low) + low);
}
9.2 舍伍德(Sherwood)算法
一、确定性算法的平均运行时间
:确定性算法对输入实例的运行时间。
:规模为的所有输入实例全体。
算法的平均运行时间:
存在实例, 。
例:快速排序算法
当输入数据均匀分布时,运行时间是。
当输入数据按递增或递减顺序排列时,算法的运行时间变坏
二、舍伍德算法的基本思想
消除不同输入实例对算法性能的影响,使随机算法对规模为的每一个实例,都有:
三、期望运行时间:
。当与相比很小可以忽略时,舍伍德算法有很好的性能。
对所有输入实例而言,运行时间相对均匀。时间复杂性与确定性算法的时间复杂性相当
9.2.1 随机快速排序算法
随机选择枢点的快速排序算法。
算法9.1 随机选择枢点的快速排序算法
输入:数组A,数组元素的的起始位置low,终止位置high
输出:按非降顺序排序的数组A
1. template class Type
2. void quicksort_random(Type A[],int low,int high)
3. {
4. random_seed(0); /* 选择系统当前时间作为随机数种子 */
5. r_quicksort(A,low,high); /* 递归调用随机快速排序算法 */
6. }
1. void r_quicksort(Type A[],int low,int high)
2. {
3. int k;
4. if (lowhigh) {
5. k = random(low,high); /* 产生low到high之间的随机数k */
6. swap(A[low],A[k]); /* 把元素A[k]交换到数组的第一个位置*/
7. k = split(A,low,high); /* 按元素A[low]把数组划分为两个
文档评论(0)