第九讲 随机算法.doc

  1. 1、本文档共17页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

0520 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档