20150401吴莎莎——算法教程解决方案.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * 蒙特卡罗算法 蒙特卡罗算法用于求解问题的准确解。 对于一些问题来说,近似解毫无意义。例如判定问题,只要回答“是”或“否”,不存在近似解回答。又如,要求一个整数的因子时所给出的解答必须是准确的,一个整数的近似因子是没有任何意义的。 蒙特卡罗算法能求得一个解,但未必是正确的。其求得正确解的概率依赖于算法所用的时间。所用时间越多,得到正确解的概率就越高,但它的缺点也在于此。在一般情况下,无法有效地判定所得到的解是否肯定正确。 * * 蒙特卡罗算法的基本思想 设p是一个实数,且1/2p1。若一个蒙特卡罗算法对于问题的任意实例得到正确解的概率不小于p,则称该蒙特卡罗算法是p正确的。且称p-1/2是该算法的优势。 若对于同一实例,蒙特卡罗算法不会给出两个不同的正确解答,则称该蒙特卡罗算法是一致的。 对于一个一致的p正确蒙特卡罗算法,要提高获得正确解的概率,只要执行该算法若干次,并选择出现频率次数最高的解即可。 * * 关于正确解的概率 在一般情况下,设δ和ε是两个正实数,且δ+ε0.5。设MC(x)是一个一致的(1/2+ε)正确的蒙特卡罗算法。不论它的优势ε有多小,都可以通过反复调用来放大算法的优势,使得最终得到的算法具有可以接受的错误概率。已经证明,重复n次调用算法MC(x)得到正确解的概率至少为1-δ。在实际应用中,大多数蒙特卡罗算法经重复调用后正确率提高很快。 * * 偏真算法 设MC(x)是解某个判定问题的蒙特卡罗算法,当它返回true时解总是正确的,仅当它返回false时有可能产生错误的解。称这类蒙特卡罗算法为偏真算法。 对于一个偏真算法,只要有一次调用返回true,就可以断定相应的解为true。假定某个偏真算法正确概率为0.55,我们只要重复调用4次,就可以将正确率提高到0.95,重复调用6次,就可以提高到0.99。而且对于偏真算法而言,原先的要求p0.5,可以放松到p0。 * * 主元素问题 设T[0..n-1]是一个有n个元素的数组。当|{i|T[i]=x}|n/2时,称元素x是数组T的主元素。我们用下面的方法来判断T中是否含有主元素: bool majority(int T[], int n){ ? x=T[random()%n];? //随机选择一个元素看成是主元素 ? count=0; ? for(i=0;in;i++) ??? if(T[i]==x) count++; ? return (countn/2);? //当countn/2时,T含有主元素,返回Ture } * * 对majority算法的分析 若算法返回结果为true,即随机选择的元素x是数组T的主元素,则显然数组T含有主元素。反之, 若返回结果为false, 则数组T未必没有主元素。由于若数组T有主元素,则它的非主元素个数小于n/2, 故上述情况发生的概率小于1/2。由此可见, majority算法是一个偏真的1/2正确算法。 或换句话说,若数组T含有主元素,则算法以大于1/2的概率返回true; 若数组T没有主元素,则算法肯定返回false。 * * 重复2次调用的majority2算法 在实际使用时,50%的错误概率是不可容忍的。重复调用技术可将错误降低到任何可接受值的范围。现在讨论重复调用2次的算法majority2。 bool majority2(int T[], int n){ ? if(majority(T,n)) return true; ? else????return? majority(T,n); } * * 对majority2算法的分析 若数组T不含主元素,则每次调用majority(T, n)返回false, 从而majority2肯定也是返回false。若数组T含有主元素, 则算法majority(T, n)返回true的概率是p1/2,而当majority(T, n)返回true时, majority2也返回true。 另一方面,majority2第一次调用majority(T, n)返回false的概率为1-p, 第二次调用majority(T, n)仍以概率p返回true。因此当数组T含有主元素时, majority2返回true的概率是p+(1-p)p=1-(1-p)23/4。即算法majority2是一个偏真3/4正确的MC蒙特卡罗算法。 * * 错误概率小于ε的偏真算法 由于重复调用majority所得到的结果是相互独立的,若T确实含有主元素,则k次重复调用majority仍然得到false的概率小于2-k。另一方面,只要有一次调用返回值为true,即可断定T中含有主元素。 对于任何给定的ε0,下面算法majorityMC重复调用log(1/ε)次算法majority。它是一个偏真的蒙特卡罗算

文档评论(0)

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

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

1亿VIP精品文档

相关文档