算法设计技巧与分析(八):随机算法(Randomized Algorithms)
文章目录
- 随机算法(Randomized Algorithms)
- 一、随机选择(Randomized Selection)
- 二、测试字符串相等性(Testing String Equality)
- 三、模式匹配(Pattern Matching)
随机算法(Randomized Algorithms)
随机算法可分为两类:
第一类被称为拉斯维加斯算法。它由那些总是给出正确答案或根本不给出答案的随机算法组成。
第二类被称为蒙特卡罗算法。它总是给出一个答案,但有时可能会产生一个不正确的答案。然而,通过在每次运行中使用独立的随机选择重复运行该算法,产生错误答案的概率可以变得任意小。
一、随机选择(Randomized Selection)
利用随机算法改进之前所提出的寻找第k小元素的算法。
算法伪代码如下:
Input: 由n个元素组成的数组A[1…n]和整数k
Output: 第k小的元素
rselect(A,1,n,k)def rselect(A,low,high,k):v = random(low,high)x = A[v]将A[low...high]分成三部分:A1 = {a|a<x}A2 = {a|a=x}A3 = {a|a>x}if |A1| > k:select(A1, 1, |A1|, k)else if |A1| < k and |A1|+|A2| >= k:return xelse if |A1| < k and |A1|+|A2| < k: select(A3, 1, |A3|, k-|A1|-|A2|)
由此可见该算法为拉斯维加斯算法。
算法时间复杂度分析:
最坏情况:当每次循环只能排除一个值且k等于n时,算法为最坏情况。将A[low…high]中的元素分为三类时需要元素比较的次数即为A数组中元素的个数,故最坏情况时的元素比较次数为n+(n-1)+…+1=n*(n-1)/2,故最坏时间复杂度为O(N^2)。
平均情况:元素比较次数小于4n,故算法平均时间复杂度为O(N)。
二、测试字符串相等性(Testing String Equality)
假设双方A和B可以通过通信信道进行通信,我们将假定该信道非常可靠。A有一个很长的字符串x,B有一个很长的字符串y,他们想确定x=y。显然,A可以将x发送给B,B可以立即测试x=y。但考虑到使用渠道的成本,这种方法将极其昂贵。另一种选择是A从x派生出一个更短的字符串,可以作为x的“指纹”并将其发送给B,然后B将使用相同的推导来获得y的指纹,然后比较这两个指纹。如果它们相等,那么B将假定x=y;否则他会得出结论x不等于y然后将测试结果通知A。
对于字符串w,假设I(w)是由位字符串w表示的整数。指纹识别的一种方法是选择素数p,然后使用指纹函数:
如果p不是太大,则指纹Ip(x)可以作为短字符串发送。如果Ip(x)不等于Ip(y),显然x不等于y,反之不正确。也就是说,如果Ip(x)=Ip(y),那么x=y不一定是这种情况。我们将这种现象称为错误匹配(false match)。
通常,如果x不等于y但Ip(x)=Ip(y)时,p整除I(x)-I(y)。
因此,每次检查两个字符串的相等性时,我们都随机选择p,而不是事先给定p。此外,随机选择p允许重新发送另一个指纹,从而在x=y的情况下增加置信度。
算法步骤如下:
1、A从小于M的素数集中随机选择p。
2、A向B发送p和Ip(x)。
3、B检查Ip(x)=Ip(y),并确认两个字符串x和y的相等或不相等。
显然该算法为蒙特卡洛算法。
该方法的缺点是,对于固定p,存在某些字符串x和y对,该方法将始终失败。那么,设n是x和y的二进制字符串的位数,p是小于2n22n^22n2的素数。错误匹配的概率为1/n。当我们重复执行这个算法k次,每次随机选择一个素数,则错误匹配的概论降低至**(1/n)^k**。
推导过程如下:
三、模式匹配(Pattern Matching)
给定一个文本字符串X=x1,x2,…,xn和一个模式Y=y1,y2,…,ym,其中m不等于n,确定图案是否显示在文本中。在不丧失一般性的情况下,我们假设文本字母表是{0, 1}。
解决这个问题最简单的方法就是在整个文本中移动模式,并在每个位置将模式与长度为m的文本部分进行比较。这种蛮力方法在最坏的情况下会导致O(mn)运行时间。
该算法遵循在文本X上滑动模式Y的相同蛮力算法,但不是将模式与每个块X(j)=xj,xj+1,…,xj+m-1进行比较,而是将模式的指纹Ip(Y)与文本块的指纹Ip(X(j))进行比较。
当我们从一个文本块转移到文本块时,新块X(j+1)的指纹可以很容易地从X(j)的指纹计算出来:
上式第一部分为所有数字向前移动一位,第二部分为去掉最高位,第三部分为加上最低位。文本块的长度为m,注意是二进制!
如果让Wp=2^m(mod p),那么我们就有了递归:
算法伪代码如下:
Input: 长度为n的文本X和长度为m的模式Y
Output: 如果Y出现在X中,则Y在X中的第一个位置;否则为0
从小于M的素数集中随机选择p
j=1
计算Wp=2^m (mod p)、Ip(Y)和Ip(Xj)
while j <= n-m+1:if Ip(Y) == Ip(Xj):return jelse:使用前面的公式计算Ip(Xj+1)j++
return 0
显然该算法为蒙特卡罗算法,
计算每一个Wp、Ip(Y)、Ip(X(1))的时间复杂度为O(m);由X(j)计算一次新块X(j+1)的指纹时间复杂度为O(1),故对于长度为n的文本指纹计算X(j+1)总的时间复杂度为O(n);故该算法的运行时间为O(n+m)。
设p是一个小于2(mn)^2的素数。错误匹配的概率为1/n。
推导过程如下:
算法转换为拉斯维加斯算法:
在任何情况下两个指纹Ip(Y)和Ip(X(j))匹配,就会测试这两个字符串是否相等。因此,我们最后给出了一个有效的模式匹配算法,该算法总是给出正确的结果,并且时间复杂度仍然是O(m+n)。
算法设计技巧与分析(八):随机算法(Randomized Algorithms)相关推荐
- C语言求解距多个点最短长度,算法设计技巧与分析课后习题答案沙特
算法设计技巧与分析课后习题答案沙特[篇一:高级算法设计实验指导书2009(李淑琴)] =txt>一.适用专业 计算机科学与技术专业研究生 二.实验目的与任务 算法分析与设计是计算机科学与技术专业 ...
- 【算法设计技巧】贪婪算法与回溯算法
贪婪算法 在前面的文章中已经见到了3个贪婪算法(greedy algorithm):Dijkstra 算法.Prim 算法和 Kruskal 算法.贪婪算法分阶段地工作.在每个阶段,可以认为所作决定是 ...
- 算法设计技巧与分析(六):图遍历(Graph Traversal)
文章目录 图遍历(Graph Traversal) 一.深度优先搜索(Depth-First Search) 二.寻找关节点(Finding Articulation Points in a Grap ...
- 算法设计技巧与分析(十一):近似算法(approximation algorithms)
文章目录 近似算法(approximation algorithms) 差界(difference bounds) 困难结果:背包问题 相对性能界(relative performance bound ...
- 021-回溯法与深搜的关系-《算法设计技巧与分析》M.H.A学习笔记
关于回溯法与深搜的关系,一直没有很好的搞明白,其实百度百科已经写得很好了: 回溯法的基本思想: 在包含问题的所有解的解空间树中,按照深度优先搜索的策略,从根结点出发深度探索解空间树.当探索到某一结点时 ...
- ReviewForJob——算法设计技巧(贪婪算法+分治算法+动态规划)
[0]README 1)本文旨在介绍算法设计技巧包括 贪婪算法.分治算法.动态规划 以及相关的荔枝等: [1]贪婪算法 1)intro: 贪婪算法是分阶段进行的,在每个阶段,可以认为所做的决定是最好的 ...
- linux算法设计,嵌入式Linux平台下随机序列算法设计.doc
嵌入式Linux平台下随机序列算法设计 嵌入式Linux平台下随机序列算法设计 [摘 要]本文以多媒体播放器的随机不重复播放机能为切入点,针对嵌入式平台实时性要求高,处理速度不够快,但系统存储歌曲量大 ...
- WebGIS空间寻径算法设计(车辆自驾导航算法)
[size=large][b]一.路网空间模型设计[/b][/size] 采用有向连通图模型对路网建模 [list] [*]A.以道路交叉点作为路网的连通图节点 [*]B.以从A路点到B路点的单向通路 ...
- 数据结构和算法解:第九章 算法设计技巧
9.1 贪婪算法 算法思想:贪婪算法分阶段的工作.在一个阶段,可以认为是所做的决定中最好好的,而不考虑将来的后果.通常,这意味着选择的是某个局部最优.这种"眼下就能拿到的就拿"的侧 ...
最新文章
- body,td,th {
- 微信小程序开发--如何在swiper中显示两个item以及下一个item的部分内容
- 寒假每日一题(入门组)【week2 完结】
- String 字符串去除特殊字符和空格,正则表达式使用,%1$s
- 第2节 mapreduce深入学习:12、reducetask运行机制(多看几遍)
- mysql 创建索引 终止_技术分享 | 常见索引问题处理
- python_16(bootstrap)
- java mongo数据去重复_java – MongoSpark保存重复的密钥错误E11000
- python 函数图解_Python函数说明(一)
- c语言如何找一个数的ac码,详细解析C语言中的开方实现
- jquery 初步(四)内容过滤器
- Android中AndFix使用
- hdu.1429.胜利大逃亡(续)(bfs + 0101011110)
- vc++无进程式线程插入穿墙技术实现
- 解决vue+php跨域问题
- 快递物流类API推荐
- iframe使用方法
- 公司如何使用开源软件
- SQL学习笔记(05)_JOIN的类型与用法
- win10 win+shift+s 截图存哪里去了