时空权衡之输入增强 ----字符串匹配算法Horspool算法和Boyer-Moore算法

在算法设计的时空权衡设计技术中,对问题的部分或者全部输入做预处理,对获得的额外信息进行存储,以加速后面问题的求解的思想,我们称作输入增强

其中字符串匹配算法Horspool算法和Boyer-Moore算法就是输入增强的例子。

首先了解一下字符串匹配的概念。我们把在一个较长的n个字符的串中,寻找一个给定的m个字符的串的问题,称为字符串匹配问题。较长的串称为text,而需要寻找的串称为pattern

字符串匹配问题的蛮力算法很好理解:我们把patterntext第一个字符对齐,从左往右比较patterntext中的每一个字符,一旦匹配不成功,就把pattern往右移动一格,重新比较。最坏的情况需要比对n-m+1次(pattern不存在text中或者存在与text末尾),每次要进行m次比较,所以蛮力算法的最差性能是O(mn)。

本次介绍的两个算法,都是想办法,在匹配出现不成功时,尽可能地移动更多的位置,从而实现算法性能的提升。

一.Horspool算法

与KMP算法相反,这两个算法在比较pattern的时候,都是从右往左比较的。以下举一个例子。考虑我们要在某个text中查找“APPLE”这一pattern。

从E开始,我们从右向左对比,如果pattern中所有的字符都匹配成功,则找到了一个子串。这时可以停止算法或者继续往右寻找。如果其中有字符匹配失败,我们需要把pattern往右移动。这里假设c是text中,对齐pattern最后一个字符的元素,则存在4种不同的情况。

情况1,pattern中不包含c(这里的c是B)。直接移动pattern长的格数。

情况2,pattern中包含c(这里的c是P),但c不是pattern中最后一个字符。则移动时应该把pattern中最右的c与text中的c对齐。

情况3,c正是pattern中最后一个字符(这里的c是E)。但剩余的m-1个字符中不包含c。也是直接移动pattern长的格数。

情况4,c正是pattern中最后一个字符(这里的c是E)。但剩余的m-1和字符中也包含c。则类似情况2,把pattern中前m-1个字符中的c和text中的c对齐。

为了加速算法,我们利用额外的空间来存储一个表。这个表中,对于text中的每一个字符,都对应一个值。这个值就是当pattern匹配不成功,且遇到的c是这个字符时,应当移动的距离。

对于每一个字符c,我们用以下公式计算距离:

例如,对于APPLE这字符串来说,除了A、P、L的单元格分别为4、2、1之外,表中所有得单元格都等于5(m=5)。这里E是5,而不是0。

填表算法很简单,把所有单元格初始化为m,然后从左往右扫描pattern,对于pattern中第j个字符(0 ≤ j ≤ m-2),将它在表中的单元格改写为m-1-j。

加上一个完整的例子:

二.Boyer-Moore算法

由于时间问题,下次继续更新。

时间: 2024-12-26 18:57:02

时空权衡之输入增强 ----字符串匹配算法Horspool算法和Boyer-Moore算法的相关文章

Redis源码分析(二十三)--- CRC循环冗余算法和RAND随机数算法

今天开始研究Redis源码中的一些工具类的代码实现,工具类在任何语言中,实现的算法原理应该都是一样的,所以可以借此机会学习一下一些比较经典的算法.比如说我今天看的Crc循环冗余校验算法和rand随机数产生算法. CRC算法全称循环冗余校验算法.CRC校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去.在接收端, 则根据信息码和CRC码之间所遵循的规则进

Hadoop Mapreduce 中的FileInputFormat类的文件切分算法和host选择算法

文件切分算法 文件切分算法主要用于确定InputSplit的个数以及每个InputSplit对应的数据段. FileInputFormat以文件为单位切分成InputSplit.对于每个文件,由以下三个属性值确定其对应的InputSplit的个数. goalSize:根据用户期望的InputSplit数据计算,即totalSize/numSplit.totalSize为文件总大小:numSplit为用户设定的Map Task个数,默认情况下是1. minSize:InputSplit的最小值,由

时空权衡之字符串匹配中的输入增强技术

字符串匹配的蛮力的算法: 对于字符数为n的文本,模式(要匹配的字符串)字符为m的字符串,简单的从左到右比较模式和文本中每一对相应的字符,,如果不匹配,模式向右移一格,再进行下一轮的尝试. 这样尝试的最大次数为n-m+1次,模式进行m次比较,这样比较次数一共是m(n-m+1)=O(nm),次,对于随机的自然文本,它的平均效率为O(n+m) 使用输入增强的思想:对模式进行预处理以得到它的一些信息,把这些信息储存在表中,然后在给定文本中实际查找模式时使用这些信息. 以下是这种思维下的两种算法: 一.H

典型字符串匹配算法实现 - 单字符串匹配算法

博客源址:http://www.jimye.com/dian-xing-zi-fu-chuang-pi-pei-suan-fa-shi-xian/ 提示:要继续向下看 相信大家对快捷键ctrl+F是做什么用的都应该很熟悉了,无论是文本编辑.网页浏览等程序上它都意味着字符串搜索,我们提供一个关键字,它将找到当前页面上的所有该关键字所在的位置.关键字称为模式串,在文本T中寻找模式串P出现的所有出现的位置,解决这种问题的算法叫做字符串匹配算法.字符串匹配算法可以说是计算机科学中最古老.研究最广泛的问题

4种字符串匹配算法:BS朴素 Rabin-karp 有限自动机 KMP(上)

字符串的匹配的算法一直都是比较基础的算法,我们本科数据结构就学过了严蔚敏的KMP算法.KMP算法应该是最高效的一种算法,但是确实稍微有点难理解.所以打算,开这个博客,一步步的介绍4种匹配的算法.也是<算法导论>上提到的.我会把提到的四种算法全部用c/c++语言实现.提供参考学习.下图的表格,介绍了各个算法的处理时间和匹配时间.希望我写的比较清楚.如果不理解的,或者不对的,欢迎留言. 字符串匹配算法及其处理时间和匹配时间 算法 预处理时间 匹配时间 朴素算法 0 O((n-m+1)m) Rabi

字符串匹配算法

字符串匹配问题的形式定义: 文本(Text)是一个长度为 n 的数组 T[1..n]: 模式(Pattern)是一个长度为 m 且 m≤n 的数组 P[1..m]: T 和 P 中的元素都属于有限的字母表 Σ 表: 如果 0≤s≤n-m,并且 T[s+1..s+m] = P[1..m],即对 1≤j≤m,有 T[s+j] = P[j],则说模式 P 在文本 T 中出现且位移为 s,且称 s 是一个有效位移(Valid Shift). 比如上图中,目标是找出所有在文本 T=abcabaabcaba

KMP字符串匹配算法及next前缀数组的应用

#KMP字符串匹配算法及next前缀数组的应用------ KMP算法通常是我们学习字符串匹配算法时遇见的第一个算法,另外还有Rabin-Karp, Sunday算法等. 相对于其他字符串匹配算法, kmp在字符串中字符重复率低的情况下并不具备优势,那为什么KMP算法会作为经典的教学算法呢? 原因可能是:KMP算法充分利用next前缀数组的信息来优化算法,减小时间复杂度的思路在很多字符串相关问题中能给我们启发. 首先上KMP字符串匹配算法, [leetcode在线测试地址](https://le

MySTL: BM算法和Sunday快速字符串匹配算法

BM算法研究了很久了,说实话BM算法的资料还是比较少的,之前找了个资料看了,还是觉得有点生涩难懂,找了篇更好的和算法更好的,总算是把BM算法搞懂了. 1977年,Robert S.Boyer和J Strother Moore提出了另一种在O(n)时间复杂度内,完成字符串匹配的算法,这个算法在单模匹配上比KMP算法还要出色 PS:其BM算法在跳转优化上的确比KMP算法要好很多,能在O(N)的上界就完成匹配了,但是不是绝对的,我们讲到后面再来说这个问题. 我们知道,KMP算法之所以能那么快,是因为他

4种字符串匹配算法:BS朴素 Rabin-karp 有限自动机 KMP(中)

接着上文(地址),我们来聊一聊自动机算法(有限自动机字符串匹配算法)和KMP算法. ====#=有限自动机算法=#===== 关于有限自动机,网上的分析的资源,大部分都很笼统,算导上的知识点,全是数学公式,看的也会特别累.因此,打算从算导的第一题开始讲起.从习题入手,讲这个算法的思想. 例子:对模式 P = aabab构造出相应的字符串匹配自动机,并说明它在文本字符串T=aaababaabaababaab上的操作过程. 再讲这个例子之前,我们有必要先来了解一下自动机是什么意思? 有限自动机是什么