`
zhangyu8374
  • 浏览: 94602 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基本算法连载(10)-模式匹配之BM(Boyer-Moore)

阅读更多
周末两天被BM算法折磨的要死。《a fast string search algorithm》论文中提到的算法思想倒是理解的差不多,但网上(http://www-igm.univ-mlv.fr/~lecroq/string/node14.html#SECTION00140)给出的实现可就是看不懂。通过Baidu,Google一搜,可以看到很多Boyer-Moore的实现。但绝大部分实现都是简化版本,只考虑了bad-character shift,而忽略了good-suffix shift。
它思想的源泉是从右向左匹配字符串将获得更多有用的信息。The algorithm precomputes two tables to process the information it obtains in each failed verification: one table calculates how many positions ahead to start the next search based on the identity of the character that caused the match attempt to fail;the other makes a similar calculation based on how many characters were matched successfully before the match attempt failed.其中前一个称作bad-character shift,后一个称作good-suffix shift。想详细了解Boyer-Moore的思想,我极力推荐看作者发表的论文,它比网上对这个算法介绍的文章容易理解的多。
处理主串为n,模式串为m的情况,此算法的最好表现是:n/m。在这种情况下,只有模式串中的最后一个字符需要比较。不相等,马上可以跳过m个字符。从这里可以看出此算法一个违反直觉的性质:模式串越长,搜索越快。
最优的代码实现(没看懂,明天贴个我自己改的):
void preBmBc(char *x, int m, int bmBc[]) {
int i;

for (i = 0; i < ASIZE; ++i)
bmBc[i] = m;
for (i = 0; i < m - 1; ++i)
bmBc[x[i]] = m - i - 1;
}


void suffixes(char *x, int m, int *suff) {
int f, g, i;

suff[m - 1] = m;
g = m - 1;
for (i = m - 2; i >= 0; --i) {
if (i > g && suff[i + m - 1 - f] < i - g)
suff[i] = suff[i + m - 1 - f];
else {
if (i < g)
g = i;
f = i;
while (g >= 0 && x[g] == x[g + m - 1 - f])
--g;
suff[i] = f - g;
}
}
}

void preBmGs(char *x, int m, int bmGs[]) {
int i, j, suff[XSIZE];

suffixes(x, m, suff);

for (i = 0; i < m; ++i)
bmGs[i] = m;
j = 0;
for (i = m - 1; i >= -1; --i)
if (i == -1 || suff[i] == i + 1)
for (; j < m - 1 - i; ++j)
if (bmGs[j] == m)
bmGs[j] = m - 1 - i;
for (i = 0; i <= m - 2; ++i)
bmGs[m - 1 - suff[i]] = m - 1 - i;
}


void BM(char *x, int m, char *y, int n) {
int i, j, bmGs[XSIZE], bmBc[ASIZE];

/* Preprocessing */
preBmGs(x, m, bmGs);
preBmBc(x, m, bmBc);

/* Searching */
j = 0;
while (j <= n - m) {
for (i = m - 1; i >= 0 && x[i] == y[i + j]; --i);
if (i < 0) {
OUTPUT(j);
j += bmGs[0];
}
else
j += MAX(bmGs[i], bmBc[y[i + j]] - m + 1 + i);
}
}


分享到:
评论

相关推荐

    论文研究-一种串匹配的快速Boyer-Moore算法.pdf

    在对经典的Boyer-Moore和Quick Search串匹配算法进行分析的基础上,提出了一种更加快速的串匹配算法Quick Boyer-Moore(QBM)。QBM算法利用当前尝试中的已匹配子串、匹配失败字符信息以及与当前窗口下一个字符的位置...

    AC-BM 多模式匹配算法

    AC-BM(Aho-Corasick-BM)算法是一种结合了Aho-Corasick算法和Boyer-Moore算法的字符串匹配方法,主要用于在一个大文本串中高效地查找多个模式串。这种算法提高了在大量模式下搜索文本的效率,减少了不必要的比较...

    一种串匹配的快速Boyer_Moore算法.pdf

    Boyer-Moore (BM) 算法因其高效性而成为串匹配中最著名的算法之一。本文介绍了一种改进的Boyer-Moore算法——QuickBoyer-Moore (QBM),该算法旨在进一步提高串匹配的速度。 #### Boyer-Moore算法简介 Boyer-Moore...

    C#,字符串匹配(模式搜索)Boyer Moore算法的源代码

    Boyer Moore 算法是字符串匹配(模式搜索)的主要高效算法之一。 Boyer-Moore(BM)算法被认为最高效的字符串搜索算法,它由Bob Boyer和J Strother Moore于1977年设计实现。通常情况下,Boyer Moore 算法比KMP算法...

    多模式的字符串匹配算法--AC_BM算法的实现代码

    其中,AC_BM算法,即Aho-Corasick算法结合Boyer-Moore算法,是一种高效的多模式字符串匹配算法。本文将深入探讨这一算法的原理,并结合实际代码,帮助读者理解其在VC6环境下的实现。 首先,我们来了解Aho-Corasick...

    算法设计--串匹配问题:BF算法、KMP算法、BM算法.rar

    本资料主要探讨了三种经典的串匹配算法:BF算法(Brute Force,暴力搜索)、KMP算法(Knuth-Morris-Pratt)以及BM算法(Boyer-Moore)。接下来,我们将详细解析这三种算法的工作原理及其优缺点。 首先,BF算法是最...

    BM算法很详尽的算法讲解

    BM算法,全称为Boyer-Moore算法,是一种高效的字符串搜索算法,特别适用于大规模数据的搜索场景。与其他常见的字符串搜索算法(如KMP算法)不同,BM算法采取了一种从右至左的比较方式,并且结合了两个重要的启发式...

    BM模式匹配算法剖析

    BM(Boyer-Moore)算法是Boyer和Moore在受到KMP算法启发后提出的一种新算法,它主要解决了KMP算法中仍然存在的部分问题,如模式串的移动策略不够优化等。BM算法的基本思想是从右向左进行模式串与文本的比较。在每次...

    单模式匹配算法 BM

    综上所述,单模式匹配算法BM是一种高效的字符串搜索方法,通过坏字符规则和好后缀规则,能够在大量文本中快速找到目标模式。它的设计思路独特,对于大型数据的处理具有显著优势。理解并掌握这种算法,对于从事文本...

    多模式匹配算法 AC_BM

    AC_BM算法,即Aho-Corasick自动机与Boyer-Moore算法的结合,是这类问题的一个强大解决方案。它结合了两种经典的字符串搜索算法,以提高搜索效率和准确性。 Aho-Corasick(AC)算法由Aho和Corasick于1975年提出,...

    BM.rar_Boyer Moore_bm_bm算法_tuned bm_visual c

    【BM算法详解与优化——Tuned Boyer-Moore算法在Visual C++中的实现】 Boyer-Moore(BM)算法是一种高效的字符串搜索算法,由Robert W. Moore和James H. Morris于1977年提出。这个算法以其高效性和在某些情况下的...

    BM模式匹配算法

    BM(Boyer-Moore)模式匹配算法是一种著名的模式匹配算法,以其高效的性能而闻名。本文将深入探讨BM算法,并介绍一种改进版——IBM模式匹配算法。 #### 二、BM模式匹配算法概述 BM算法是由美国学者R.S. Boyer和J.S...

    AC算法和AC-BM算法

    5. `(BMH)stringsearch.pdf`:这可能是Boyer-Moore-Horspool算法(一个更简单的变体)的资料,虽然不是直接与AC-BM相关,但可能作为对比或扩展阅读。 6. `acbm`:这个文件可能是AC-BM算法的源代码或者一个可执行程序...

    用C++实现BM的字符串模式匹配算法

    本篇文章将深入探讨如何使用C++实现Bad Character Rule(坏字符规则)和Good Suffix Rule(好后缀规则)来优化Boyer-Moore(BM)字符串匹配算法。BM算法以其高效的性能在文本搜索、数据挖掘等多个领域广泛应用。 ...

    IP搜索--BM模式匹配 代码

    BM(Boyer-Moore)模式匹配算法是一种高效且广泛使用的字符串查找算法,由Robert S. Boyer和J Strother Moore于1977年提出。在这个场景中,我们关注的是将BM算法应用于IP地址的搜索,这在网络安全、网络监控或数据...

    BM算法 N-BOX算法

    BM算法(Boyer-Moore算法)是一种高效的文字查找算法,由Robert S. Boyer和J Strother Moore在1977年提出。它的主要特点是利用了模式串(待查找的字符串)的信息来减少不必要的匹配,从而显著提高了搜索效率。N-BOX...

    bm算法-C语言实现.docx

    bm算法是Boyer-Moore算法的简称,它是一种字符串搜索算法,用于在文本串中查找模式串。下面是bm算法的C语言实现的知识点: 相关概念 * 字符串搜索算法:bm算法是一种字符串搜索算法,用于在文本串中查找模式串。 *...

    字符串匹配算法-BM算法的实现代码

    BM(Boyer-Moore)算法是一种高效的字符串搜索算法,由Robert S. Boyer和J Strother Moore于1977年提出。它的主要优点在于减少了不必要的字符比较,从而提高了搜索速度。BM算法通过利用坏字符规则和好后缀规则来减少...

    字符串模式匹配算法的改进研究

    传统的字符串模式匹配算法如KMP(Knuth-Morris-Pratt)算法和BM(Boyer-Moore)算法虽然已经较为成熟,但在特定场景下仍存在效率瓶颈。因此,不断探索并改进这些算法,对于提升NIDS的整体性能具有重要意义。 #### ...

    基于字符串模式匹配算法的病毒感染检测问题_算法_数据结构_

    5. **Sunday算法**:类似于Boyer-Moore-Horspool,但在模式字符串的后缀部分做了优化。 在C语言中实现这些算法时,我们需要关注以下几点: 1. **数据结构**:合理地组织数据结构,如数组或链表,以存储目标字符串...

Global site tag (gtag.js) - Google Analytics