随机算法gydF4y2Ba
一个gydF4y2Ba随机化算法gydF4y2Ba是一种使用随机来源作为其逻辑的一部分的技术。它通常用于减少运行时间或gydF4y2Ba时间复杂度gydF4y2Ba;或者在标准算法中使用的内存,或者空间复杂度。该算法通过生成一个随机数来工作,gydF4y2Ba ,在指定的数字范围内,并据此做出决策gydF4y2Ba 的价值。gydF4y2Ba
随机算法可以通过抛硬币或从一副牌中抽出一张牌来帮助在怀疑的情况下做出决定。同样,这种算法可以帮助加快agydF4y2Ba蛮力gydF4y2Ba通过对输入进行随机抽样,以获得可能不是完全最优,但足以满足指定目的的解决方案。gydF4y2Ba
一位主管正试图根据几个指标给一所高中打分,她希望通过秘密采访学生收集的信息来做到这一点。然而,该学区的所有学校都必须这样做,所以面试每一个学生将花费她无法承受的时间。她该怎么办?gydF4y2Ba
校长应该采用一种随机算法,在不认识任何一个孩子的情况下,她会随机选择一些孩子并采访他们,希望她能得到各种各样的学生。这种技术通常被称为gydF4y2Ba随机抽样gydF4y2Ba,这是一种随机算法。当然,她知道有gydF4y2Ba收益递减gydF4y2Ba从每一次额外的采访中,当收集到的数据量测量到她试图测量到可接受的准确性时,应该停止。管理者决定学校分数的方式可以被认为是一个随机算法。gydF4y2Ba
内容gydF4y2Ba
随机算法的定义gydF4y2Ba
随机算法在有时间或内存限制时使用,平均情况解是可接受的输出。由于算法的输出存在潜在的错误,因此,本文提出了一种改进算法gydF4y2Ba算法gydF4y2Ba被称为gydF4y2Ba放大gydF4y2Ba是为了通过牺牲运行时来提高正确性的概率。放大的工作原理是对输入的不同随机子样本重复随机算法几次,并比较它们的结果。随机算法通常只放大过程的一部分,因为放大太多可能会增加超出给定约束的运行时间。gydF4y2Ba
随机算法通常以两种常见形式之一设计:作为gydF4y2Ba拉斯维加斯gydF4y2Ba或者作为gydF4y2Ba蒙特卡罗gydF4y2Ba算法。拉斯维加斯算法在指定的时间内运行。如果它在这个时间框架内找到了解决方案,那么这个解决方案将是完全正确的;然而,它有可能耗尽时间,无法找到任何解决方案。另一方面,蒙特卡洛算法是一种概率算法,根据输入的不同,产生错误结果或完全不能产生结果的概率很小。gydF4y2Ba
实际上,计算机不能生成完全随机的数字,因此计算机科学中的随机算法是用a来近似的gydF4y2Ba伪随机数生成器gydF4y2Ba代替真正的随机数来源,如抽牌。gydF4y2Ba
蒙特卡罗算法gydF4y2Ba
直观的解释gydF4y2Ba
这款名为《命运之轮》的游戏可以使用蒙特卡罗随机算法进行游戏。玩家(或计算机)不是有意识地选择字母,而是随机选择字母来获得解决方案,如下图所示。玩家透露的字母越多,他们对自己的解决方案就越有信心。然而,如果玩家没有快速猜出答案,其他玩家猜出答案的几率也会增加。因此,蒙特卡洛算法被赋予了一个确定的时间量,在此时间内,它必须根据所揭示的信息提出一个“猜测”;这是它能想出的最佳解决方案。这允许错误的可能性,如果蒙特卡洛算法没有足够的时间来揭示足够有用的字母,甚至可能是很大的错误概率。但提供时间限制可以控制算法所需的时间,从而降低另一个玩家猜测并获得奖品的风险。然而,需要注意的是,这个博弈不同于标准的蒙特卡罗算法,因为博弈只有一个正确的解,而对于蒙特卡罗算法,“足够好”的解是一个可接受的输出。gydF4y2Ba
这种算法的术语,蒙特卡洛,是由数学家尼古拉斯·Metropolis,斯坦尼斯瓦夫·乌兰和约翰·冯·诺伊曼创造的,他们在研究gydF4y2Ba曼哈顿计划gydF4y2Ba大约在20世纪40年代。这个名字是在1949年发表的一篇研究论文中发现的,一些消息来源认为,乌兰的叔叔每年都要去摩纳哥的蒙特卡洛赌博。gydF4y2Ba[1]gydF4y2Ba
技术示例:逼近gydF4y2Ba
更有技术含量的蒙特卡罗算法的一个经典例子在于逼近的解决方案gydF4y2BaπgydF4y2Ba,gydF4y2Ba 圆的周长与直径之比。这种近似问题非常普遍,以至于在大银行和其他对数学要求严格的公司的程序员职位面试中都会被问到。gydF4y2Ba
想象一下,你是盲人,有人让你找出一个物体的形状。直观地说,解决办法是尽可能多地触摸物体,直到脑海中出现一个熟悉的物体,这时你就可以猜测了。近似时也应用相同的策略gydF4y2Ba .gydF4y2Ba
从一个笛卡尔平面(x,y坐标)开始,x轴从gydF4y2Ba 来gydF4y2Ba 的y轴gydF4y2Ba 来gydF4y2Ba .这将是一个gydF4y2Ba 盒子。然后在这个网格上生成许多随机点。数一下点数,gydF4y2BaCgydF4y2Ba,落在附近的gydF4y2Ba 从原点开始gydF4y2Ba ,和点数,gydF4y2BaTgydF4y2Ba,那不是。例如,gydF4y2Ba 小于gydF4y2Ba 从原点,但是gydF4y2Ba 是gydF4y2Ba 从原点开始,由gydF4y2Ba勾股定理gydF4y2Ba.gydF4y2Ba
现在我们可以近似圆周率,已知圆的面积与矩形边界的面积之比应等于圆内点与圆外点的比值;也就是说,gydF4y2Ba
)gydF4y2Ba
这导致结论,随着更多的随机样本获得,近似gydF4y2Ba 改进,如下所示。gydF4y2Ba
拉斯维加斯算法gydF4y2Ba
直觉gydF4y2Ba
拉斯维加斯算法是一种随机算法,它总是产生正确的结果,或者根本找不到结果,但它不能保证时间限制;的gydF4y2Ba时间复杂度gydF4y2Ba不同的输入。然而,它确实保证了最坏情况下的上界。gydF4y2Ba
拉斯维加斯的算法几乎每次人们查东西的时候都会出现。把拉斯维加斯算法想象成一个任务,当找到解决方案时,它完全有信心这是正确的解决方案,但通往那里的道路可能是模糊的。作为一个非常一般化和简化的例子,拉斯维加斯算法可以被认为是用户在网上搜索某些东西时使用的策略。由于在线搜索每一个网站是非常低效的,用户通常会使用搜索引擎来开始。然后,用户会在网上冲浪,直到找到一个网站,其中包含了用户正在寻找的东西。由于点击链接是一个相当随机的过程,假设用户不确切地知道另一端的网站上包含什么,时间复杂性的范围从幸运地在第一个链接上到达目标网站,到不幸地花费无数小时徒劳。这是一种拉斯维加斯算法,因为用户确切地知道她在寻找什么,所以一旦找到网站,就没有出错的可能性。类似地,如果用户超过了分配的上网时间,她将终止该过程,因为她知道没有找到解决方案。gydF4y2Ba
这个算法的术语,gydF4y2Ba拉斯维加斯gydF4y2Ba这个词是数学家拉兹洛·巴贝在1979年发明的,他只是想用这个词来与更古老的词作比较gydF4y2Ba蒙特卡罗gydF4y2Ba算法,因为两者都是世界主要的赌博中心。然而,两者的赌博风格与算法的风格无关,因为不能说拉斯维加斯的赌博总是给出正确的,甚至是正的结果。gydF4y2Ba[3]gydF4y2Ba
随机快速排序gydF4y2Ba
一种常见的拉斯维加斯随机算法是gydF4y2Ba快速排序gydF4y2Ba,一个gydF4y2Ba排序算法gydF4y2Ba这样就可以在不使用额外内存的情况下对元素进行排序。由于这是一个基于比较的算法,最坏的情况将发生在执行成对比较时gydF4y2Ba ,其中所花费的时间随着要排序的位数的平方而增长。然而,通过随机化,该算法的运行时间可以减少到gydF4y2Ba .gydF4y2Ba
快速排序应用了一种分而治之的方法来对一组数字进行排序,gydF4y2Ba .它分三步工作:首先选择一个主元,gydF4y2Ba ,使用随机数生成器(因此是随机算法);然后将数组重新排列为两个子数组gydF4y2Ba 而且gydF4y2Ba ,其中第一个和第二个数组中的元素分别大于和小于gydF4y2Ba ,分别。gydF4y2Ba
然后,算法递归地应用上述快速排序的步骤对两个独立的数组,从而输出一个完全排序的数组。gydF4y2Ba
伪代码gydF4y2Ba
1 2 3 4 5 6 7 8 9 10 11gydF4y2Ba |
|
在最坏的情况下,这个算法需要O(n²)时间来排序gydF4y2Ba 如果随机选择的主元是数组中的第一个或最后一个元素,则为数字。gydF4y2Ba
以下是一个gydF4y2Ba时间复杂度gydF4y2Ba快速排序的最坏情况分析。因为每次插入和删除都需要gydF4y2Ba 时间,分区需要时间gydF4y2Ba 时间,因为每个项都必须迭代以创建两个子数组,如果选择数组中最小或最大的元素,则分区将产生两个数组:一个大小为0,因为数组的一端没有项,另一个大小为0gydF4y2Ba ;不包括所选的主元。因此,运行时分析如下:gydF4y2Ba
从?开始的最后一步是什么gydF4y2Ba算术级数gydF4y2Ba.gydF4y2Ba
现在,使用随机快速排序,其中主元是随机选择的,数组中最小或最大的数字都没有被选择,预期运行时是gydF4y2Ba .gydF4y2Ba
如果运气对算法有利,每次都选取中间值的元素,则数组会不断被分成两半,得到如下时间复杂度:gydF4y2Ba
但是,这个发生的概率是1 /gydF4y2Ba 数字,非常小。然而,如果我们得到的是10%-90%的分割,而不是如上所示的50%、50%呢?算法仍然有效!这是因为递归树的深度仍然是gydF4y2Ba ,它需要gydF4y2Ba 执行递归树的一个级别。因此,随机快速排序为数字数组排序提供了很大的优势。gydF4y2Ba
大西洋城算法gydF4y2Ba
蒙特卡洛算法总是快速且可能正确,而拉斯维加斯算法有时快速但总是正确。有一种算法正好位于这两者之间,它叫做gydF4y2Ba大西洋城gydF4y2Ba算法。这种类型的算法满足了另外两种:它几乎总是快速的,而且几乎总是正确的。然而,设计这些算法是一个极其复杂的过程,所以它们很少存在。gydF4y2Ba
计算复杂度gydF4y2Ba
随机算法有一个gydF4y2Ba复杂性类gydF4y2Ba属于他们自己,因为他们是在gydF4y2Ba概率图灵机gydF4y2Ba.最基本的概率复杂度类叫做gydF4y2BaRPgydF4y2Ba,随机多项式时间算法,其中包含问题与一个有效的随机算法,取gydF4y2Ba多项式时间gydF4y2Ba,并以绝对的确定性识别坏的解决方案,以至少1 / 2的概率识别正确的解决方案。gydF4y2Ba
放大可以与RP算法一起使用,以增加识别正确答案的概率。由于所述识别发生的概率为1 / 2,因此该算法可以重复gydF4y2Ba 乘以,以得到正确的解概率为1-gydF4y2Ba 次了。因此,如果一个RP算法被执行100次,每次得到错误答案的几率比宇宙射线破坏运行算法的计算机内存的几率要低!这使得RP算法非常实用。gydF4y2Ba[4]gydF4y2Ba
RP类的补称为co-RP,这意味着正确的解被绝对肯定地接受,但如果答案是不正确的,算法就会被接受gydF4y2Ba 输出概率gydF4y2Ba没有gydF4y2Ba.gydF4y2Ba
具有多项式时间运行复杂度的随机算法,其输出总是正确的,称为ingydF4y2Ba腭咽gydF4y2Ba,或零误差概率多项式时间算法。ZPP是拉斯维加斯算法它是RP和co-RP两种算法。最后,允许YES和no实例都带有某种错误的一类问题,通常称为蒙特卡罗算法,属于复杂度类gydF4y2BaBPPgydF4y2Ba,有界误差概率多项式时间。gydF4y2Ba
DerandomizationgydF4y2Ba
值得一提的是,相当多的数学家和理论家正在研究一种有效的去随机化过程,在保持运行时不变的情况下,从算法中去除所有的随机性。虽然已经开发了一些技术,但是否gydF4y2Ba ,在那里gydF4y2Ba 是一个gydF4y2Ba多项式时间算法gydF4y2Ba这仍然是一个悬而未决的问题。大多数理论家都相信这一点gydF4y2Ba ,但这还没有得到正式证明。gydF4y2Ba
关于所涉及的问题的更技术性的参考gydF4y2Ba ,请参考论文gydF4y2Ba在P=BPP的世界里gydF4y2Ba,作者是以色列魏茨曼科学研究所数学与计算机科学学院的计算机科学教授Oded Goldreich。gydF4y2Ba
附加的例子gydF4y2Ba
在这个时代,效率和性能决定了一个产品的成败;因此,算法设计者将注意力集中在减少计算时间上,经常转向随机算法。以下是在许多流行的计算机科学和数学课程中遇到的一些常见的随机算法,以及日常遇到的常见软件和硬件程序。gydF4y2Ba
素性测试gydF4y2Ba
测试一个数字是否为gydF4y2Ba主要的gydF4y2Ba或gydF4y2Ba复合gydF4y2Ba已经是一个跨越几个世纪的问题,今天仍然是一个现代问题gydF4y2Ba加密gydF4y2Ba在许多其他技术中,保护重要信息的技术都依赖于它。gydF4y2Ba
素性测试gydF4y2Ba是20世纪70年代正式开发的第一批随机算法之一,然而,这个想法可以追溯到17世纪,当时费马发表了他的gydF4y2Ba小定理gydF4y2Ba,它帮助计算整数的幂gydF4y2Ba模gydF4y2Ba质数。gydF4y2Ba
随机算法被用来执行质数测试,以避免暴力搜索,这将包括一个耗时的线性搜索每个质数导致的数字。gydF4y2Ba
随机最小切割gydF4y2Ba
的gydF4y2Ba最大流Min-cutgydF4y2Ba算法是应用于网络流的另一种基本随机化算法gydF4y2Ba图的问题gydF4y2Ba.目标是找到最小的边的总权重,如果删除这些边,将在a中断开源与汇的连接gydF4y2Ba最大流量网络问题gydF4y2Ba.由于必须检查每条边,以自信地确保找到正确答案,因此开发了随机算法,以通过承认算法输出错误答案的轻微概率来加快这一过程。有关图中最小裁剪的最著名的随机算法的更多信息,请参见gydF4y2BaFord-Fulkerson算法gydF4y2Ba.gydF4y2Ba
矩阵积检验的Frievalds算法gydF4y2Ba
鉴于三gydF4y2Ba xgydF4y2Ba 矩阵,gydF4y2Ba一个gydF4y2Ba,gydF4y2BaBgydF4y2Ba,gydF4y2BaCgydF4y2Ba,一个常见的问题是验证是否gydF4y2Ba .由于矩阵乘法是一个相当昂贵的过程,检查所述的等式将需要对等式两边进行逐项比较,为了避免这种暴力检查等式的方法,已经开发了随机算法。最著名的算法是以Rusins Frievalds的名字命名的,他意识到通过使用随机化,他可以减少这个问题的运行时间gydF4y2Ba蛮力矩阵乘法gydF4y2Ba使用gydF4y2BaStrassen算法gydF4y2Ba的运行时gydF4y2Ba ,gydF4y2Ba ,在那里gydF4y2BakgydF4y2Ba算法执行的次数。尽管Frievald的算法速度很快,但它是在假设失败的概率小于gydF4y2Ba .gydF4y2Ba
参考书目gydF4y2Ba
Demaine, E., Devadas, S., Lynch, N.。gydF4y2Ba算法设计与分析“,gydF4y2Ba.麻省理工学院公开课程。检索自2016年6月6日,http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-design-and-analysis-of-algorithms-spring-2015/gydF4y2Ba
科尔曼、t;雷瑟尔森,c;里维斯特,r;Stein C。gydF4y2Ba算法导论,第二版。gydF4y2Ba马萨诸塞州剑桥:麻省理工学院出版社,1990年。gydF4y2Ba
参考文献gydF4y2Ba
- Zhigilei, L。gydF4y2BaComputational-Materials-Group-NotesgydF4y2Ba.检索2016年6月11日,从gydF4y2Bahttp://www.people.virginia.edu/~lz2n/mse524/notes-2003/MC.pdfgydF4y2Ba
- 乔,C。gydF4y2Ba蒙特卡罗gydF4y2Ba.检索自2016年6月9日gydF4y2Bahttps://simple.wikipedia.org/wiki/Monte_Carlo_algorithm#/media/File:Pi_30K.gifgydF4y2Ba
- 英属哥伦比亚大学。gydF4y2BaCached-Correspondence-Between-ProfessorsgydF4y2Ba.检索自2016年6月gydF4y2Bawww.cs.ubc.ca /蜘蛛/ hoo /出版/ aaai99-pac.psgydF4y2Ba
- 拉宾(2014)。Classifying-Problems-into-Complexity-Classes。gydF4y2BaAdvances-in-ComputersgydF4y2Ba,gydF4y2Bavol. - 95gydF4y2Ba, 239 - 292。gydF4y2Ba