算法设计与分析第7章概率算法.ppt
《算法设计与分析第7章概率算法.ppt》由会员分享,可在线阅读,更多相关《算法设计与分析第7章概率算法.ppt(48页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第7章章 随机算法随机算法1学习要点学习要点了解随机算法的基本特征了解随机算法的基本特征理解产生伪随机数的算法理解产生伪随机数的算法掌握数值随机化算法的设计思想掌握数值随机化算法的设计思想 掌握舍伍德算法的设计思想掌握舍伍德算法的设计思想掌握拉斯维加斯算法的设计思想掌握拉斯维加斯算法的设计思想掌握蒙特卡罗算法的设计思想掌握蒙特卡罗算法的设计思想2概述概述 前面各章讨论的算法的每一个步骤都是确定的,而本前面各章讨论的算法的每一个步骤都是确定的,而本章讨论的随机算法允许算法在执行过程中随机地选择一下章讨论的随机算法允许算法在执行过程中随机地选择一下计算步骤。计算步骤。在许多情况下,一般算法比较复
2、杂,性能较差,很多在许多情况下,一般算法比较复杂,性能较差,很多具有很好平均运行时间的算法,在最坏的情况下,却具有具有很好平均运行时间的算法,在最坏的情况下,却具有很坏的性能。由于随机性选择比最优选择省时间,因此引很坏的性能。由于随机性选择比最优选择省时间,因此引入随机化算法可以在很大程度上降低算法的复杂度。入随机化算法可以在很大程度上降低算法的复杂度。3很早以前就被人们所发现和利用。17世纪,人们就知道用事件发生的“频率”来决定事件的“概率”。19世纪人们用投针试验的方法来决定。高速计算机的出现,使得用数学方法在计算机上大量模拟这样的试验成为可能。4从从Buffon(蒲丰蒲丰)投针问题谈起投
3、针问题谈起 567概述概述随机算法对所求解问题的同一个实例用同一随机算法求解随机算法对所求解问题的同一个实例用同一随机算法求解两次可能得到完全不同的效果。这两次求解所需要的时间,两次可能得到完全不同的效果。这两次求解所需要的时间,甚至所得到的结果都可能会有相当大的差别。甚至所得到的结果都可能会有相当大的差别。包括包括数值概率算法数值概率算法蒙特卡罗(蒙特卡罗(Monte Carlo)算法)算法拉斯维加斯(拉斯维加斯(Las Vegas)算法)算法舍伍德(舍伍德(Sherwood)算法)算法8数值概率算法常用于数值问题的求解。将一个问题的计算与某数值概率算法常用于数值问题的求解。将一个问题的计算
4、与某个概率分布已经确定的事件联系起来,求问题的近似解。这类个概率分布已经确定的事件联系起来,求问题的近似解。这类算法所得到的往往是近似解,且近似解的精度随计算时间的增算法所得到的往往是近似解,且近似解的精度随计算时间的增加而不断提高。在许多情况下,要计算出问题的精确解是不可加而不断提高。在许多情况下,要计算出问题的精确解是不可能或没有必要的,因此可以用数值随机化算法得到相当满意的能或没有必要的,因此可以用数值随机化算法得到相当满意的解。解。蒙特卡罗算法用于求问题的准确解,但得到的解未必是正确蒙特卡罗算法用于求问题的准确解,但得到的解未必是正确的。蒙特卡罗算法以正的概率给出正解,求得正确解的概率
5、的。蒙特卡罗算法以正的概率给出正解,求得正确解的概率依赖于算法所用的时间。算法所用的时间越多,得到正确解依赖于算法所用的时间。算法所用的时间越多,得到正确解的概率就越高。一般给定执行步骤的上界,给定一个输入,的概率就越高。一般给定执行步骤的上界,给定一个输入,算法都是在一个固定的步数内停止的。算法都是在一个固定的步数内停止的。随机算法的分类随机算法的分类9舍伍德算法总能求得问题的一个解,且所求得的解总是正确的。舍伍德算法总能求得问题的一个解,且所求得的解总是正确的。当一个确定性算法在最坏情况下的计算复杂性与其在平均情况当一个确定性算法在最坏情况下的计算复杂性与其在平均情况下的计算复杂性有较大差
6、别时,可在这个确定性算法中引入随下的计算复杂性有较大差别时,可在这个确定性算法中引入随机性将它改造成一个舍伍德算法,消除或减少问题的好坏实例机性将它改造成一个舍伍德算法,消除或减少问题的好坏实例间的这种差别(精髓所在)。间的这种差别(精髓所在)。拉斯维加斯算法不会得到不正确的解。一旦用拉斯维加斯算法拉斯维加斯算法不会得到不正确的解。一旦用拉斯维加斯算法找到一个解,这个解就一定是正确解。但有时可能找不到解。找到一个解,这个解就一定是正确解。但有时可能找不到解。拉斯维加斯算法找到正确解的概率随着它所用的计算时间的增拉斯维加斯算法找到正确解的概率随着它所用的计算时间的增加而提高。对于所求解问题的任意
7、实例,用同一拉斯维加斯算加而提高。对于所求解问题的任意实例,用同一拉斯维加斯算法反复对它求解,可以使求解失效的概率任意小。法反复对它求解,可以使求解失效的概率任意小。随机算法的分类随机算法的分类107.1随机数随机数117.1随机数随机数随机数在随机化算法设计中扮演着十分重要的角色。在现实计算机上随机数在随机化算法设计中扮演着十分重要的角色。在现实计算机上无法产生真正的随机数,因此在随机化算法中使用的随机数都是一定无法产生真正的随机数,因此在随机化算法中使用的随机数都是一定程度上随机的,即伪随机数。程度上随机的,即伪随机数。线性同余法是产生伪随机数的最常用的方法。由线性同余法产生的随线性同余法
8、是产生伪随机数的最常用的方法。由线性同余法产生的随机序列机序列a0,a1,an,满足:,满足:(混合同余法)其中其中b 0,c 0,d m。d称为该随机序列的种子。如何选取该方法称为该随机序列的种子。如何选取该方法中的常数中的常数b、c和和m直接关系到所产生的随机序列的随机性能。这是随直接关系到所产生的随机序列的随机性能。这是随机性理论研究的内容,已超出本书讨论的范围。从直观上看,机性理论研究的内容,已超出本书讨论的范围。从直观上看,m应取应取得充分大,因此可取得充分大,因此可取m为机器大数。为机器大数。12d=1 种子m=11 b=6 c=0(1,6,3,7,9,10,5,8,4,2,1,6
9、,3)13复杂一些的生成器复杂一些的生成器Multiple recursive generator14算法实现算法实现许多程序语言中都自带生成随机数的方法,如 c 中的 random()函数,Matlab中的rand()函数等。但这些生成器生成的随机数效果很不一样,比如 c 中的函数生成的随机数性质就比较差,如果用 c,最好自己再编一个程序。Matlab 中的 rand()函数,经过了很多优化。可以产生性质很好的随机数,可以直接利用。15 下面用计算机产生的伪随机数来模拟抛硬币实下面用计算机产生的伪随机数来模拟抛硬币实验。假设抛验。假设抛10次硬币构成一个事件。调用次硬币构成一个事件。调用Ra
10、ndom(2)返回一个二值结果。返回返回一个二值结果。返回0表示抛硬币表示抛硬币得到反面,返回得到反面,返回1表示得到正面。下面的算法表示得到正面。下面的算法TossCoins模拟抛模拟抛10次硬币这一事件次硬币这一事件50000次。用次。用headi(0 i 10)记录这记录这50000此模拟恰好得到此模拟恰好得到i次次正面的次数。最终输出模拟抛硬币事件得到正面事正面的次数。最终输出模拟抛硬币事件得到正面事件的频率图,如下图所示:件的频率图,如下图所示:16 0 *1 *2 *3 *4 *5 *6 *7 *8 *9 *10 *模拟抛硬币得到的正面事件频率图模拟抛硬币得到的正面事件频率图17v
11、oid main(void)/模拟随机抛硬币事件模拟随机抛硬币事件const int NCOINS=10;const long NTOSSES=50000L;/headsi是得到是得到i次正面的次数次正面的次数long i,headsNCOINS+1;int j,position;/初始化数组初始化数组headsfor(j=0;j NCOIN+1;j+)headsj=0;/重复重复50000次模拟事件次模拟事件for(i=0;i NTOSSES;i+)headsTossCoins(NCOINS)+;/输出频率图输出频率图for(i=0;i=NCOINS;i+)position=int(floa
12、t(headsi)/NTOSSES*72);coutsetw(6)i;for(j=0;jposition-1;j+)cout;cout*endl;int TossCoins(int numberCoins)/随机抛硬币随机抛硬币 static RandomNumber coinToss;int i,tosses=0;for(i=0;i numberCoins;i+)/Random(2)=1 表示正面表示正面 tosses+=coinToss.Random(2);return tosses;int TossCoins(int numberCoins)/随机抛硬币随机抛硬币 static Rand
13、omNumber coinToss;int i,tosses=0;for(i=0;i numberCoins;i+)/Random(2)=1 表示正面表示正面 tosses+=coinToss.Random(2);return tosses;187.2 数值随机化算法数值随机化算法197.2 数值随机化算法数值随机化算法7.2.1 用随机投点法计算用随机投点法计算 值值值值 设有一半径为设有一半径为r的圆及其外切四边形。向该正的圆及其外切四边形。向该正方形随机地投掷方形随机地投掷n个点。设落入圆内的点数为个点。设落入圆内的点数为k。由于所投入的点在正方形上均匀分布,因而所投由于所投入的点在正方
14、形上均匀分布,因而所投入的点落入圆内的概率为入的点落入圆内的概率为 。所以当所以当n足够大时,足够大时,k与与n之比就逼近这一概率。从之比就逼近这一概率。从而而 。20在具体实现时,只要在第一象限计算即可:在具体实现时,只要在第一象限计算即可:double Darts(int n)/用随机投点法计算用随机投点法计算 值值 static RandomNumber dart;int k=0;for(int i=1;i=n;i+)double x=dart.fRandom();double y=dart.fRandom();if(x*x+y*y)=1)k+;return 4*k/double(n);
15、217.2.2 计算定积分计算定积分(1)用随机投点法计算定积分)用随机投点法计算定积分 设设f(x)是是0,1上的连续函数,且上的连续函数,且0 f(x)1。需要计算的积。需要计算的积分分为为 ,积分积分 I 等于图中的面积等于图中的面积G。在图所示单位正方形内均匀地作投点试在图所示单位正方形内均匀地作投点试验,则随机点落在曲线下面的概率为:验,则随机点落在曲线下面的概率为:假设向单位正方形内随机地投入假设向单位正方形内随机地投入n个个点点(xi,yi),i=1,2,n。随机点(。随机点(xi,yi)落入)落入G内,则内,则yi f(xi)。)。如果有如果有m个点落入个点落入G内,则随机点落
16、入内,则随机点落入G内的概率,即内的概率,即22double Darts(int n)/用随机投点法计算定积分用随机投点法计算定积分static RandomNumber dart;int k=0;for(int i=1;i=n;i+)double x=dart.fRandom();double y=dart.fRandom();if(y=f(x)k+;return k/double(n)237.3 舍伍德算法舍伍德算法247.3 舍伍德算法舍伍德算法 设设A是一个确定性算法,当它的输入实例为是一个确定性算法,当它的输入实例为x时所需的时所需的计算时间记为计算时间记为tA(x)。设。设Xn是算
17、法是算法A的输入规模为的输入规模为n的实例的实例的全体,则当问题的输入规模为的全体,则当问题的输入规模为n时,算法时,算法A所需的平均时所需的平均时间为间为 这显然不能排除存在这显然不能排除存在xXn使得使得 的可的可能性。希望获得一个随机化算法能性。希望获得一个随机化算法B,使得对问题的输入规,使得对问题的输入规模为模为n的每一个实例均有的每一个实例均有 这就是舍伍德算法设计的基本思想。当这就是舍伍德算法设计的基本思想。当s(n)与与 相比可忽略时,舍伍德算法可获得很好的平均性能。相比可忽略时,舍伍德算法可获得很好的平均性能。257.3.1 随机快速算法随机快速算法7.3.2 随机选择算法随
18、机选择算法7.3.2 搜索有序表搜索有序表267.3.1 随机快速排序算法随机快速排序算法随机快速排序算法随机快速排序算法快速排序算法快速排序算法算法的核心在于选择合适的划分基准算法的核心在于选择合适的划分基准改变快速排序算法性能不稳定,即输入相关的问题改变快速排序算法性能不稳定,即输入相关的问题27template void quicksort_random(Type A,int low,int high)random_seed(0);/*选择系统当前时间作为随机数种子选择系统当前时间作为随机数种子*/r_quicksort(A,low,high);/*递归调用随机快速排序算法递归调用随机快
19、速排序算法*/void r_quicksort(Type A,int low,int high)int k;if(lowhigh)k=random(low,high);/*产生产生low到到high之间的随机之间的随机数数k*/swap(Alow,Ak);/*把元素把元素Ak交换到数组交换到数组的第一个位置的第一个位置*/k=split(A,low,high);/*按元素按元素Alow把数组划分为把数组划分为两个两个*/r_quicksort(A,low,k-1);/*排序第一个子数组排序第一个子数组*/r_quicksort(A,k+1,high);/*排序第二个子数组排序第二个子数组*/随
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 设计 分析 概率
限制150内