字符串匹配

字符串匹配的Boyer-Moore算法

杀马特。学长 韩版系。学妹 提交于 2019-12-10 00:05:30
上一篇文章,我介绍了 KMP算法 。 但是,它并不是效率最高的算法,实际采用并不多。各种文本编辑器的"查找"功能(Ctrl+F),大多采用 Boyer-Moore算法 。 Boyer-Moore算法不仅效率高,而且构思巧妙,容易理解。1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了这种算法。 下面,我根据Moore教授自己的 例子 来解释这种算法。 1. 假定字符串为"HERE IS A SIMPLE EXAMPLE",搜索词为"EXAMPLE"。 2. 首先,"字符串"与"搜索词"头部对齐,从尾部开始比较。 这是一个很聪明的想法,因为如果尾部字符不匹配,那么只要一次比较,就可以知道前7个字符(整体上)肯定不是要找的结果。 我们看到,"S"与"E"不匹配。这时, "S"就被称为"坏字符"(bad character),即不匹配的字符。 我们还发现,"S"不包含在搜索词"EXAMPLE"之中,这意味着可以把搜索词直接移到"S"的后一位。 3. 依然从尾部开始比较,发现"P"与"E"不匹配,所以"P"是"坏字符"。但是,"P"包含在搜索词"EXAMPLE"之中。所以,将搜索词后移两位,两个"P"对齐。 4. 我们由此总结出 "坏字符规则" :   后移位数 = 坏字符的位置 - 搜索词中的上一次出现位置 如果"坏字符

字符串匹配算法之"Boyer Moore"

柔情痞子 提交于 2019-12-09 23:49:23
Boyer-Moore字符串搜索算法是一种非常高效的字符串搜索算法。它由Bob Boyer和J Strother Moore设计于1977年,最初的定义1975年就给出了,后续才给出构造算法以及算法证明。 先假定部分定义: 1、pattern 为模式字符串,长度为patLen; 2、Text为目标查找字符串,长度为n; 2、当前不匹配字符在pattern中位置为 j(0≤ j ≤patLen -1); 3、已经匹配的长度为 m(0≤ m <patLen); 4、先假设不匹配字符在pattern中位置为 Δ(*),其中*可以是任何字符; 很多资料里面讲解原理时说的数组位置都是从1开始的,这里为了好理解code,都是从0开始; 首先来看下坏字符规则: 一、坏字符规则( bad character rule ): 让不匹配字符和pattern中最右边出现的该字符对齐匹配,如果没有则全部跳过; >假设1 :遇到不匹配字符,如果该字符在pattern 中不存在,有:(如下图示跳转) 字符指针右移:patLen 长度 后和 pattern 右对齐; Pattern 右移:patLen – m; >假设2 :遇到不匹配字符,如果该字符在pattern 中存在,这里也分两种情况: a>.在pattern最右边出现的该字符在当前不匹配字符左边, 有:(如下图示跳转) 字符指针右移:j–Δ(‘-’)

字符串匹配算法之Boyer-Moore-Horspool Algorithm

筅森魡賤 提交于 2019-12-09 23:27:27
Boyer-Moore-Horspool 算法也称Horspool 算法,由Nigel Horspool 设计于1980年,是在BM算法上改进版,因为BM算法里面的 好后缀规则较难理解,同时其效率与正确性的证明当时一直没有得到解决,所以Horspool 算法只用了一个BM里的坏字符规则. 借用“find a needle in a haystack” 典故,意为"大海捞针",引意到我们这里就是 从haystack 字串中查找needle字串(needle 字串等同pattern字串),同时假定haystack字串长度n,needle字串长度为m; 基本原理: Horspool 算法 也是从右向左比较 , 但Horspool算法相对于 Boyer-Moore 算法改进了坏字符规则;从右向左匹配,当遇到 不匹配字符 (mismatch character) 时 : BM 跳转规则 : 当前 不匹配字符 和needle中最右边出现的该字符对齐匹配 ; Horspool 跳转规则: haystack 字串中与 needle 字串尾部字符对应的字符 和 needle 中最右边出现的该字符匹配 ; 坏字符规则跳转表初始化和 BM 中一样,理解了原理, code 理解起来就容易了; 下面是实现代码: #include <stdio.h> #include <string.h> //