模式匹配之Boyer-Moore算法

BM 算法是一个较优的模式匹配算法。一般,如果不考虑模式串的长度,一个具有时间复杂度O(n)的算法应该是最优的了,但是事实不是如此。BM算法可以实现更高效率的模式匹配。分析和实验说明,BM匹配算法对于那些字符集比较大,而模式串中出现的字符比较少的时候,工作效率最快。而且,考虑KMP匹配方式的优化,可以结合KMP匹配和BM匹配,进一步提高效率。

算法的关键和 KMP 类似,也是构造一个辅助数组,不过,不同于KMP算法的是,BM算法的辅助数组大小只和匹配串的字符集大小相关(一般情况下也就是ASCII字符集,256个字符),其内容和模式串相关,辅助数组的内容即是模式串的索引:position[patten[i]]=i;  也是相当简单的辅助数组构造。

一个简单的例子:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

/*  辅助数组,取决于字符集和,默认的采用 ASCII字符集,256个元素*/
#define LEN 256
int BMMatcher(char *s, char *p, int index, int position[])
/*
参数说明:
 char *s:  匹配串
 char *p:  模式串
 int index: 模式串匹配的起始位置,是匹配串的索引
 int position[] 辅助数组,
*/
{
    int len = strlen(s);
    int i,j, nextindex;

    i = strlen(p)-1;
    j = index+strlen(p)-1;
    for(; i>=0; i--, j--)
    {
        if(s[j] != p[i])break;
    }
    if(i<0) return 0;      /*匹配成功*/
    else  if(position[s[j]]>0)nextindex = index + i - position[s[j]];
     else nextindex = index + 1;

    if(nextindex > LEN-strlen(p)) return -1;  /*匹配失败,无法进行下一次匹配*/
    else return nextindex;    /*匹配失败,需要下一次匹配*/
}   

/*测试, 匹配串 和 模式串都使用小写字符*/
int main()
{
    int position[LEN]={0};     /*辅助数组*/
 char *src="it is just a test, what would you do?";  /*匹配串*/
 char *patten="what would";    /*模式串*/
 int i, nextindex, index=-2, pos=0;

 for(i=0; i<strlen(patten); i++)   /*构造辅助数组,关键的一步,但是很简单*/
  position[patten[i]]=i;
 index = BMMatcher(src, patten, 0, position);
 while(!(index==-1 || index==0))  /*循环匹配,直到匹配成功,或者匹配失败结束*/
 {
     nextindex = index;
  index = BMMatcher(src, patten, nextindex, position);
 }  

 if(index == -1)
  printf("Can not find it/n");
 if(index == 0)
  printf("Find it, the index is: %d./n", nextindex);
    system("PAUSE");
    return 0;
}转载自:http://blog.csdn.net/jixingzhong/article/details/1465387
时间: 2024-07-30 10:18:40

模式匹配之Boyer-Moore算法的相关文章

Boyer Moore算法(字符串匹配)

上一篇文章,我介绍了KMP算法. 但是,它并不是效率最高的算法,实际采用并不多.各种文本编辑器的"查找"功能(Ctrl+F),大多采用Boyer-Moore算法. Boyer-Moore算法不仅效率高,而且构思巧妙,容易理解.1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了这种算法. 下面,我根据Moore教授自己的例子来解释这种算法. 1. 假定字符串为"HERE IS A SIMPLE EXAMPLE",搜

【算法视频】字符串模式匹配--布鲁特.福斯算法

2.4.字符串模式匹配 资讯网址:www.qghkt.com 腾讯课堂:https://qghkt.ke.qq.com/20个常用算法 模式串(或子串)在主串中的定位操作通常称为串的模式匹配,它是各种串处理系统中最重要的运算之一. 2.4.1.布鲁特-福斯算法 [基本思想] 从主串的第一个字符起与模式串的第一个字符比较,若相等,则继续逐个字符进行后续比较,否则从主串的第二个字符起与模式串的第一个字符重新开始比较,直至模式串中每个字符依次与主串中的一个连续的字符序列相等时为止,此时称为匹配成功:如

字符串模式匹配的几种算法

1.KMP算法 KMP算法程序看起来比较简单,但是求next数组的过程还是比较难理解,next数组实质就是求最大的前后缀,该算法的复杂度是O(m+n),算法流程如下: 假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置 如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++,继续匹配下一个字符: 如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j].此举意味着失配时,模式串P相对于文本串S向右移动了

LeetcodeOJ: Implement strStr() [ Boyer–Moore string search algorithm ]

1 class Solution { 2 public: 3 int strStr(char *haystack, char *needle) { 4 5 int i = 0 , skip[256]; 6 char *str = haystack, *substr = needle; 7 int len_src = strlen(str), len_sub = strlen(substr); 8 // preprocess 9 for (i = 0; i < 256; i++) 10 skip[

List的基本操作实战与基于模式匹配的List排序算法实现之Scala学习笔记-23

package com.leegh.dataset /** * @author Guohui Li */object HelloList { def main(args: Array[String]): Unit = { val bigData = List("Hadoop", "Spark") val data = List(1, 2, 3) val bigData_Core = "Hadoop" :: ("Spark" :

字符串匹配(BF,BM,Sunday,KMP算法解析)

字符串匹配一直是计算机领域热门的研究问题之一,多种算法层出不穷.字符串匹配算法有着很强的实用价值,应用于信息搜索,拼写检查,生物信息学等多个领域. 今天介绍几种比较有名的算法: 1. BF 2. BM 3. Sunday 4. KMP -,BF算法 BF(Brute Force)算法又称为暴力匹配算法,是普通模式匹配算法. 其算法思想很简单,从主串S的第pos个字符开始,和模式串T的第一个字符进行比较,若相等,则主串和模式串都后移一个字符继续比较:若不相同,则回溯到主串S的第pos+1个字符重新

字符串匹配系列算法

问题描述: 在匹配串中寻找模式串,如: 匹配串:THIS IS A SIMPLE EXAMPLE 模式串(搜索词):EXAMPLE 算法1:Brute Force算法(蛮力搜索法) 首先将匹配串和模式串左对齐,然后从左向右一个一个进行比较,如果不成功则模式串向右移动一个单位. 算法2:Karp Rabin算法 模式串:pattern="pappar",长度记为pattern_len 文本串:text="pappappapparrassanuaragh" 预备阶段就是

DPI (Deep Packet Inspection) 深度包检测技术

详解DPI与网络回溯分析技术 随着网络通讯技术进步与发展,网络通讯已跨入大数据时代,如何监控各类业务系统的通讯数据在大数据流量中传输质量,以及针对海量的网络通讯数据的范畴中存在少量的恶意流量的检测,避免恶意通讯对主机.网络设备的root权限的安全威胁,和通讯内容的窃取.是网络管理必须面对的一个难题. 有攻击的矛,自有防御的盾,这是自然发展的规律.针对大数据的来临,传统的实时检测与防御已不能胜任对海量数据中存在细微异常的甄别.为此,对原始通讯数据的实时备份逐渐彰显出其必要性,而基于时间窗口的回溯分

字符串的模式匹配——Brute-Force算法和KMP算法

子串的定位操作是要在主串S中找出一个与子串T相同的子串,通常把主串S称为目标,把子串T称为模式把从目标S中查找模式为T的子串的过程称为“模式匹配”. 1.Brute-Force算法的设计思想 Brute-Force是普通的模式匹配算法.将主串S的第1个字符和模式T的第1个字符比较,若相等,继续逐个比较后续字符:若不等,从主串的下一字符起,重新与模式的第一个字符比较,直到主串的一个连续子串字符序列与模式相等 ,返回值为S中与T匹配的子序列第一个字符的序号,即匹配成功:否则,匹配失败,返回值 0.

字符串匹配常见算法(BF,RK,KMP,BM,Sunday)

今日了解了一下字符串匹配的各种方法. 并对sundaysearch算法实现并且单元. 字符串匹配算法,是在实际工程中经常遇到的问题,也是各大公司笔试面试的常考题目.此算法通常输入为原字符串(string)和子串(pattern),要求返回子串在原字符串中首次出现的位置.比如原字符串为"ABCDEFG",子串为"DEF",则算法返回3.常见的算法包括:BF(Brute Force,暴力检索).RK(Robin-Karp,哈希检索).KMP(教科书上最常见算法).BM(