欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载
     

    算法设计与分析第7章概率算法.ppt

    • 资源ID:3488346       资源大小:654.05KB        全文页数:48页
    • 资源格式: PPT        下载积分:6
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要6
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    算法设计与分析第7章概率算法.ppt

    1,第7章 随机算法,2,学习要点 了解随机算法的基本特征 理解产生伪随机数的算法 掌握数值随机化算法的设计思想 掌握舍伍德算法的设计思想 掌握拉斯维加斯算法的设计思想 掌握蒙特卡罗算法的设计思想,3,概述,前面各章讨论的算法的每一个步骤都是确定的,而本章讨论的随机算法允许算法在执行过程中随机地选择一下计算步骤。,在许多情况下,一般算法比较复杂,性能较差,很多具有很好平均运行时间的算法,在最坏的情况下,却具有很坏的性能。由于随机性选择比最优选择省时间,因此引入随机化算法可以在很大程度上降低算法的复杂度。,4,很早以前就被人们所发现和利用。17世纪,人们就知道用事件发生的“频率”来决定事件的“概率”。19世纪人们用投针试验的方法来决定。高速计算机的出现,使得用数学方法在计算机上大量模拟这样的试验成为可能。,5,从Buffon(蒲丰)投针问题谈起,6,7,8,概述,随机算法对所求解问题的同一个实例用同一随机算法求解两次可能得到完全不同的效果。这两次求解所需要的时间,甚至所得到的结果都可能会有相当大的差别。 包括 数值概率算法 蒙特卡罗(Monte Carlo)算法 拉斯维加斯(Las Vegas)算法 舍伍德(Sherwood)算法,9,数值概率算法常用于数值问题的求解。将一个问题的计算与某个概率分布已经确定的事件联系起来,求问题的近似解。这类算法所得到的往往是近似解,且近似解的精度随计算时间的增加而不断提高。在许多情况下,要计算出问题的精确解是不可能或没有必要的,因此可以用数值随机化算法得到相当满意的解。,蒙特卡罗算法用于求问题的准确解,但得到的解未必是正确的。蒙特卡罗算法以正的概率给出正解,求得正确解的概率依赖于算法所用的时间。算法所用的时间越多,得到正确解的概率就越高。一般给定执行步骤的上界,给定一个输入,算法都是在一个固定的步数内停止的。,随机算法的分类,10,舍伍德算法总能求得问题的一个解,且所求得的解总是正确的。当一个确定性算法在最坏情况下的计算复杂性与其在平均情况下的计算复杂性有较大差别时,可在这个确定性算法中引入随机性将它改造成一个舍伍德算法,消除或减少问题的好坏实例间的这种差别(精髓所在)。,拉斯维加斯算法不会得到不正确的解。一旦用拉斯维加斯算法找到一个解,这个解就一定是正确解。但有时可能找不到解。拉斯维加斯算法找到正确解的概率随着它所用的计算时间的增加而提高。对于所求解问题的任意实例,用同一拉斯维加斯算法反复对它求解,可以使求解失效的概率任意小。,随机算法的分类,11,7.1随机数,12,7.1随机数,随机数在随机化算法设计中扮演着十分重要的角色。在现实计算机上无法产生真正的随机数,因此在随机化算法中使用的随机数都是一定程度上随机的,即伪随机数。 线性同余法是产生伪随机数的最常用的方法。由线性同余法产生的随机序列a0,a1,an,满足:(混合同余法) 其中b0,c0,dm。d称为该随机序列的种子。如何选取该方法中的常数b、c和m直接关系到所产生的随机序列的随机性能。这是随机性理论研究的内容,已超出本书讨论的范围。从直观上看,m应取得充分大,因此可取m为机器大数。,13,d = 1 种子 m= 11 b=6 c = 0 (1,6,3,7,9,10,5,8,4,2,1,6,3),14,复杂一些的生成器,Multiple recursive generator,15,算法实现,许多程序语言中都自带生成随机数的方法,如 c 中的 random() 函数,Matlab中的rand()函数等。 但这些生成器生成的随机数效果很不一样,比如 c 中的函数生成的随机数性质就比较差,如果用 c ,最好自己再编一个程序。Matlab 中的 rand() 函数,经过了很多优化。可以产生性质很好的随 机数,可以直接利用。,16,下面用计算机产生的伪随机数来模拟抛硬币实验。假设抛10次硬币构成一个事件。调用Random(2)返回一个二值结果。返回0表示抛硬币得到反面,返回1表示得到正面。下面的算法TossCoins模拟抛10次硬币这一事件50000次。用headi (0 i 10)记录这50000此模拟恰好得到i次正面的次数。最终输出模拟抛硬币事件得到正面事件的频率图,如下图所示:,17,0 * 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10 *,模拟抛硬币得到的正面事件频率图,18,void main (void) / 模拟随机抛硬币事件 const int NCOINS = 10; const long NTOSSES = 50000L; / headsi是得到i次正面的次数 long i, headsNCOINS+1; int j, position; / 初始化数组heads for (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 (float (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 RandomNumber coinToss; int i, tosses = 0; for (i = 0; i numberCoins; i+) / Random (2) = 1 表示正面 tosses += coinToss.Random (2); return tosses; ,19,7.2 数值随机化算法,20,7.2 数值随机化算法,7.2.1 用随机投点法计算值 设有一半径为r的圆及其外切四边形。向该正方形随机地投掷n个点。设落入圆内的点数为k。由于所投入的点在正方形上均匀分布,因而所投入的点落入圆内的概率为 。,所以当n足够大时,k与n之比就逼近这一概率。从而 。,21,在具体实现时,只要在第一象限计算即可: 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); ,22,7.2.2 计算定积分,(1)用随机投点法计算定积分 设f(x)是0,1上的连续函数,且0f(x)1。需要计算的积分 为 , 积分 I 等于图中的面积G。,在图所示单位正方形内均匀地作投点试 验,则随机点落在曲线下面的概率为:,假设向单位正方形内随机地投入n个 点(xi,yi),i = 1,2,n。随机点(xi,yi)落入G内,则yi f(xi)。 如果有m个点落入G内,则随机点落入G内的概率,即,23,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 (y=f(x) k+; return k/double(n) ,24,7.3 舍伍德算法,25,7.3 舍伍德算法,设A是一个确定性算法,当它的输入实例为x时所需的计算时间记为tA(x)。设Xn是算法A的输入规模为n的实例的全体,则当问题的输入规模为n时,算法A所需的平均时间为,这显然不能排除存在xXn使得 的可能性。希望获得一个随机化算法B,使得对问题的输入规模为n的每一个实例均有,这就是舍伍德算法设计的基本思想。当s(n)与 相比可忽略时,舍伍德算法可获得很好的平均性能。,26,7.3.1 随机快速算法 7.3.2 随机选择算法 7.3.2 搜索有序表,27,7.3.1 随机快速排序算法,随机快速排序算法 快速排序算法 算法的核心在于选择合适的划分基准 改变快速排序算法性能不稳定,即输入相关的问题,28,template void quicksort_random(Type A,int low,int high) random_seed(0); /* 选择系统当前时间作为随机数种子 */ r_quicksort(A,low,high); /* 递归调用随机快速排序算法 */ ,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); /* 排序第二个子数组 */ ,随机快速排序算法,29,最坏时间复杂度仍是:O(n2) 最坏情况:当随机数发生器第i次随机产生的枢点元素恰恰就是数组中第i大或第i小的元素时造成最坏情况 与输入无关 情况是微乎其微的 输入元素的任何排列顺序,都不可能使算法行为处于最坏的情况 期望运行时间是O(nlogn),30,7.3.2 随机选择算法,选择问题 给定线性序集中n个元素和一个整数1kn,要求找出这n个元素中第k小的元素,对选择问题而言,用中位数作为划分基准可以保证在最坏情况下用线性时间完成选择。如果只简单地用待划分数组的第一个元素作为划分基准,则算法的平均性能较好,而在最坏的情况下需要O(n2)计算时间。 舍伍德型选择算法则随机地一个数组元素作为划分基准。这样既能保证算法的线性时间平均性能又避免了计算拟中位数的麻烦。,31,template Type select(Type a,int l,int k) /计算al:r中第k小元素 static RandomNumber rnd; while (true) if( l =r) return al; int i = l, j=l + rnd.Random(r- l+1); /随机选择划分基准 swap(ai,aj); j=r+1; Type pivot=al; /以划分基准为轴作元素交换 while (true) while (a+ipivot); if (i=j) break; Swap (ai,aj); ,if (j-l+1=k) return pivot; al=aj; aj=pivot; /对子数组重复划分过程 if (j-l+1k) k=k-j+l-1; l=j+1; else r=j-1; ,32,由于算法select使用随机数产生器随机地产生1和r之间的随机整数。因此,算法select所产生的划分基准是随机的。在这个条件下,可以证明,当用算法select对含有n个元素的数组进行划分时,划分出的低区子数组中含有1个元素的概率为2/n;含有i个元素的概率为1/n,i=2,3,n-1。设T(n)是算法select作用于一个含有n个元素的输入数组上所需的期望时间的一个上界,且T(n)是单调递增的。在最坏情况下,第k小元素总是被划分在较大的子数组中。由此,可以得到关于T(n)的递归式:,33,在上面的推导中,从第一行到第二行是因为max(1,n-1)=n-1,并且当n是奇数时,T(n/2),T(n/2+1),T(n-1)在和式中均出现2次;n 是偶数时, T(n/2+1),T(n/2+2),T(n-1)均出现两次,T(n/2)只出现一次。因此,第二行中的和式是第一行中和式的一个上界。从第2行到第3行是因为在最坏情况下T(n-1)=O(n2),故可将T(n-1)/n包含在O(n)中。由此可知,非递归的舍伍德型选择算法可以在O(n)平均时间内实现。,34,上述舍伍德选择算法对确定性选择算法所做的修改非常简单且容易实现。但有时所给的确定性算法无法直接改造成舍伍德算法。此时可借助随机预处理技术,不改变原有的确定性算法仅对其输入进行随机洗牌,同样可收到舍伍德算法的效果。例如,对于确定性选择算法,可以用下面的洗牌算法Shuffle将数组a中的元素随机排列,然后用确定性选择算法求解。这样做的效果与舍伍德型算法是一样的。,template void Shuffle (Type a, int n) /随机洗牌算法 static RandomNumber rnd; for (int i=0; i n; i+) int j=rnd.Random(n-i)+i; Swap (ai,aj); ,拉斯维加斯( Las Vegas )算法,拉斯维加斯算法的一个显著特征是它所作的随机性决策有可能导致算法找不到所需的解。,public static void obstinate(Object x, Object y) / 反复调用拉斯维加斯算法LV(x,y),直到找到问题的一个解y boolean success= false; while (!success) success=lv(x,y); ,设p(x)是对输入x调用拉斯维加斯算法获得问题的一个解的概率。一个正确的拉斯维加斯算法应该对所有输入x均有p(x)0。 设t(x)是算法obstinate找到具体实例x的一个解所需的平均时间 ,s(x)和e(x)分别是算法对于具体实例x求解成功或求解失败所需的平均时间,则有: 解此方程可得:,36,n后问题,对于n后问题的任何一个解而言,每一个皇后在棋盘上的位置无任何规律,不具有系统性,而更象是随机放置的。由此容易想到下面的拉斯维加斯算法。,在棋盘上相继的各行中随机地放置皇后,并注意使新放置的皇后与已放置的皇后互不攻击,直至n个皇后均已相容地放置好,或已没有下一个皇后的可放置位置时为止。,如果将上述随机放置策略与回溯法相结合,可能会获得更好的效果。可以先在棋盘的若干行中随机地放置皇后,然后在后继行中用回溯法继续放置,直至找到一个解或宣告失败。随机放置的皇后越多,后继回溯搜索所需的时间就越少,但失败的概率也就越大。,37,n 皇后问题,问题描述 n皇后问题要求将n个皇后放在n×n棋盘的不同行、不同列、不同斜线的位置,找出相应的放置方案 随机化措施 对某行放置皇后的有效位置进行随机 对某行所有列位置进行随机,38,n 皇后问题,Class Queen public: friend void nQueen(int); private: bool Place(int k); /测试皇后k置于第xk列的合法性 bool QueenLV(void); /随机放置n个皇后拉斯维加斯算法 int n, *x,*y; /n表示皇后个数,x和y表示解向量 ; Bool Queen:Place(int k) for(int j=1;jk;j+) if(abs(k-j)=abs(x j-xk)|(x j=xk) return false; return true; ,39,对某行放置皇后的有效位置进行随机算法 bool Queen:QueensLV( ) RandomNumber rnd; /随机数产生器 int k=1; /下一个放置的皇后编号 int count=1;/记录当前要放置的第k个皇后在第k行的有效位置数 while(k0) count=0; for(int i=1;i0) xk+=yrnd.Random(count); return (count0); /count0表示放置成功 ,40,对某行所有列位置进行随机的拉斯维加斯算法 bool Queen:QueensLV1(void) /棋盘上随机放置n个皇后拉斯维加斯算法 RandomNumber rnd; /随机数产生器 int k=1; /下一个放置的皇后编号 int count=maxcout;/尝试产生随机位置的最大次数,用户根据需要设置 while(kn); /kn表示放置成功 ,整数因子分解,设n1是一个整数。关于整数n的因子分解问题是找出n的如下形式的惟一分解式: 其中,p1p2pk是k个素数,m1,m2,mk是k个正整数。 如果n是一个合数,则n必有一个非平凡因子x,1xn,使得x可以整除n。给定一个合数n,求n的一个非平凡因子的问题称为整数n的因子分割问题。,private static int split(int n) int m = (int) Math.floor(Math.sqrt(double)n); for (int i=2; i=m; i+) if (n%i=0) return i; return 1; ,事实上,算法split(n)是对范围在1x的所有整数进行了试除而得到范围在1x2的任一整数的因子分割。,Pollard算法,在开始时选取0n-1范围内的随机数,然后递归地由 产生无穷序列 对于i=2k,以及2kj2k+1,算法计算出xj-xi与n的最大公因子 d=gcd(xj-xi,n)。如果d是n的非平凡因子,则实现对n的一次分割,算法输出n的因子d。,private static void pollard(int n) / 求整数n因子分割的拉斯维加斯算法 rnd = new Random(); / 初始化随机数 int i=1,k=2; int x=rnd.random(n),y=x; / 随机整数 while (true) i+; x=(x*x-1)%n; int d=gcd(y-x,n); / 求n的非平凡因子 if (d1) ,对Pollard算法更深入的分析可知,执行算法的while循环约 次后,Pollard算法会输出n的一个因子p。由于n的最小素因子p ,故Pollard算法可在O(n1/4)时间内找到n的一个素因子。,蒙特卡罗(Monte Carlo)算法,在实际应用中常会遇到一些问题,不论采用确定性算法或概率算法都无法保证每次都能得到正确的解答。蒙特卡罗算法则在一般情况下可以保证对问题的所有实例都以高概率给出正确解,但是通常无法判定一个具体解是否正确。 设p是一个实数,且1/2p1。如果一个蒙特卡罗算法对于问题的任一实例得到正确解的概率不小于p,则称该蒙特卡罗算法是p正确的,且称p-1/2是该算法的优势。 如果对于同一实例,蒙特卡罗算法不会给出2个不同的正确解答,则称该蒙特卡罗算法是一致的。 有些蒙特卡罗算法除了具有描述问题实例的输入参数外,还具有描述错误解可接受概率的参数。这类算法的计算时间复杂性通常由问题的实例规模以及错误解可接受概率的函数来描述。,蒙特卡罗(Monte Carlo)算法,对于一个一致的p正确蒙特卡罗算法,要提高获得正确解的概率,只要执行该算法若干次,并选择出现频次最高的解即可。 如果重复调用一个一致的(1/2+)正确的蒙特卡罗算法2m-1次,得到正确解的概率至少为1-,其中,,对于一个解所给问题的蒙特卡罗算法MC(x),如果存在问题实例的子集X使得: (1)当xX时,MC(x)返回的解是正确的; (2)当xX时,正确解是y0,但MC(x)返回的解未必是y0。 称上述算法MC(x)是偏y0的算法。,重复调用一个一致的,p正确偏y0蒙特卡罗算法k次,可得到一个O(1-(1-p)k)正确的蒙特卡罗算法,且所得算法仍是一个一致的偏y0蒙特卡罗算法。,主元素问题,设T1:n是一个含有n个元素的数组。当|i|Ti=x|n/2时,称元素x是数组T的主元素。,public static boolean majority(intt, int n) / 判定主元素的蒙特卡罗算法 rnd = new Random(); int i=rnd.random(n)+1; int x=ti; / 随机选择数组元素 int k=0; for (int j=1;jn/2); / kn/2 时t含有主元素 ,public static boolean majorityMC(intt, int n, double e) / 重复é ù次调用算法majority int k= (int) Math.ceil(Math.log(1/e)/Math.log(2); for (int i=1;i=k;i+) if (majority(t,n) return true; return false; ,对于任何给定的0,算法majorityMC重复调用log(1/) 次算法majority。它是一个偏真蒙特卡罗算法,且其错误概率小于。算法majorityMC所需的计算时间显然是O(nlog(1/ )。,素数测试,Wilson定理:对于给定的正整数n,判定n是一个素数的充要条件是(n-1)! -1(mod n)。 费尔马小定理:如果p是一个素数,且0ap,则ap-1(mod p)。 二次探测定理:如果p是一个素数,且0xp,则方程x21(mod p)的解为x=1,p-1。,private static int power(int a, int p, int n) / 计算 ap mod n,并实施对n的二次探测 int x, result; if (p=0) result=1; else x=power(a,p/2,n); / 递归计算 result=(x*x)%n; / 二次探测 if (result=1),public static boolean prime(int n) / 素数测试的蒙特卡罗算法 rnd = new Random(); int a, result; composite=false; a=rnd.random(n-3)+2; result=power(a,n-1,n); if (composite|(result!=1) return false; else return true; ,算法prime是一个偏假3/4正确的蒙特卡罗算法。通过多次重复调用错误概率不超过(1/4)k。这是一个很保守的估计,实际使用的效果要好得多。,47,POJ例题分析,POJ 3318 给出3个n*n(n500)的矩阵A,B,C,验证A*B=C? n3算法会超时。 n2的概率算法: 随机置换法则:如果比特向量a b, r为随机向量,那么 Pr(a,r) (b,r) 1/2 随机一个1*n的向量r,验证A*B*r=C*r,若成立,输出 “YES”,否则输出“NO”。 如果A*BC,算法以1/2的概率输出“NO”!,48,POJ例题分析,POJ2576 有一堆数,需要分为两堆。要求两堆之间元素个数差不超过1,并且两堆和的差值尽量小。(元素个数100,元素值 450) 动态规划可以解决。 随机算法如下: 1. 计算两堆的大小后,随机分为两堆。 2. 随机选择两堆中的数,如果交换后差变小,则交换。 3. 重复2,直到多次交换未发生。更新答案。 4. 回到1,重新开始。,

    注意事项

    本文(算法设计与分析第7章概率算法.ppt)为本站会员(本田雅阁)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开