参考资料:

http://blog.csdn.net/eric491179912/article/details/6210009

 

http://blog.163.com/pengfeicui@yeah/blog/static/106403250201092681158650/

 

 

这里,我们仅仅用了坏字符规则

定义一个滑动距离函数:

dist(C)=  1)  m – j                          j =  max{j| tj = c && 1<= j <= m - 1}

                  2)    m                              若C不出现在模式中或tm = c

比如 T = pattern    dist(a)= 7 – 2  ;  dist(t) = 7 – 4 (算最后出现的)  ; dist(e) =  7 – 5 ; dist(r) = 7 - 6;

        最后一个dist(n) =  7 (m ,模式串T的总长度) ,其他的未出现的字符, dist(ch) =  7;

程序如下:

   1:  void  BMDist(string str,int dist[]) 
   2:  {
   3:      int i;
   4:      for (i = 0; i < 256; i++)
   5:      {
   6:          dist[i] = str.length();
   7:      }
   8:      for (i = 0; i < str.length() - 1; i++)//最后一个字符取不到
   9:      {
  10:          dist[str[i]] = str.length() - i - 1;
  11:      }
  12:      dist[str[str.length()-1]] = str.length();
  13:   
  14:  }
  15:   
  16:  int  BM(string s, string t,int dist[]) 
  17:  {
  18:       int i = t.length();
  19:       while(i <= s.length())
  20:       {
  21:        int j = t.length();
  22:        while(j>0 && s[i-1]==t[j-1])
  23:        {
  24:            j--;
  25:            i--;
  26:        }
  27:        if (j == 0)
  28:        {
  29:            return i + 1;
  30:        }
  31:        else
  32:        { 
  33:            i = i + dist[s[i-1]];
  34:        }
  35:       }
  36:       return -1;
  37:  }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

测试代码:

   1:  int main()
   2:   
   3:  {
   4:      
   5:      while(1)
   6:  {
   7:      clock_t start,stop;
   8:      string Str,Tsr;
   9:      
  10:      int flag1,flag2,flag3;
  11:      int dist[256];
  12:   
  13:      int next[1000]={0,};
  14:      cout <<"请输入S串与T串:" <<endl;
  15:      cin >> Str >> Tsr;
  16:      cout << endl;
  17:   
  18:      start = clock();
  19:      for (int i=0; i< 1000; i++)
  20:      {
  21:         flag1 = BF(Str,Tsr);
  22:      }
  23:      stop = clock();
  24:      cout << "BF算法的执行时间是:"<< stop - start << endl;
  25:   
  26:     
  27:      start = clock();
  28:      for (int i=0; i< 1000; i++)
  29:      {
  30:          kmpNext(Tsr,next);
  31:          flag2 =  kmp(Str,Tsr,next);
  32:      }
  33:      stop = clock();
  34:      cout << "KMP算法的执行时间是:"<< stop - start << endl;
  35:   
  36:      
  37:      start = clock();
  38:      for (int i=0; i< 1000; i++)
  39:      {
  40:          BMDist(Tsr,dist);
  41:          flag3 = BM(Str,Tsr,dist);
  42:      }
  43:      stop = clock();
  44:      cout << "BM算法的执行时间是:"<< stop - start << endl;
  45:   
  46:      if (flag1 == -1)
  47:      {
  48:          cout << "没有找到子串"<<endl;
  49:      }
  50:      else
  51:      {
  52:          cout << "找到子串的位置为"<< flag1 <<endl;
  53:      }
  54:      if (flag2 == -1)
  55:      {
  56:          cout << "没有找到子串"<<endl;
  57:      }
  58:      else
  59:      {
  60:          cout << "找到子串的位置为"<< flag2 <<endl;
  61:      }
  62:      if (flag3 == -1)
  63:      {
  64:          cout << "没有找到子串"<<endl;
  65:      }
  66:      else
  67:      {
  68:          cout << "找到子串的位置为"<< flag3 <<endl;
  69:      }
  70:  }
  71:   
  72:      return 0;
  73:  }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

串匹配算法之BM算法的更多相关文章

  1. 字符串匹配的Boyer-Moore(BM)算法

    各种文本编辑器的"查找"功能(Ctrl+F),大多采用Boyer-Moore算法. Boyer-Moore算法不仅效率高,而且构思巧妙,容易理解.1977年,德克萨斯大学的Robe ...

  2. 【算法】BM算法

    目录 BM算法 一. 字符串比较的分析 二.BM算法的思想 三.算法实现 BM算法 @ 一. 字符串比较的分析 如果要判定长度为\(n\)两个字符串相等,比较中要进行\(n\)比较,但是如果要判定两个 ...

  3. hrbustoj 1551:基础数据结构——字符串2 病毒II(字符串匹配,BM算法练习)

    基础数据结构——字符串2 病毒IITime Limit: 1000 MS Memory Limit: 10240 KTotal Submit: 284(138 users) Total Accepte ...

  4. 算法——字符串匹配之BM算法

    前言 Boyer-Moore算法是一种基于后缀匹配的模式串匹配算法(简称BM算法),后缀匹配就是模式串从右到左開始比較,但模式串的移动依旧是从左到右的.在实践中.BM算法效率高于前面介绍的<KM ...

  5. 如何在文本编辑器中实现时间复杂度O(n/m)的搜索功能? BM算法

    //字符串匹配 public class StringCmp { //约定:A主串长 n ,B模式串 长m.要求:在A串中找到B串匹配的下标 //BM算法:从B串和A串尾部开始比较,希望一次将B串向后 ...

  6. 字符串匹配算法(二)-BM算法详解

    我们在字符串匹配算法(一)学习了BF算法和RK算法,那有没更加高效的字符串匹配算法呢.我们今天就来聊一聊BM算法. BM算法 我们把模式串和主串的匹配过程,可以看做是固定主串,然后模式串不断在往后滑动 ...

  7. LG5487 【模板】线性递推+BM算法

    [模板]线性递推+BM算法 给出一个数列 \(P\) 从 \(0\) 开始的前 \(n\) 项,求序列 \(P\) 在\(\bmod~998244353\) 下的最短线性递推式,并在 \(\bmod~ ...

  8. 字符串匹配之horspool算法(简化的BM算法)

    前面介绍在BF,KMP这些算法的时候老是提到BM这个东西,究竟这什么东西,有啥高深的,这些问题我们如今不去考虑.不知道,认真读前几篇文章的读者有没有发现前面的算法都是从模式串的前面開始匹配的,那我们就 ...

  9. Boyer-Moore(BM)算法,文本查找,字符串匹配问题

    KMP算法的时间复杂度是O(m + n),而Boyer-Moore算法的时间复杂度是O(n/m).文本查找中“ctrl + f”一般就是采用的BM算法. Boyer-Moore算法的关键点: 从右遍历 ...

随机推荐

  1. 【Mysql 优化 6】mysql优化的内容和思路

    根据最近做mysql优化,以及参照的官方文档的一些知识点,总结一下,如何下手去优化mysql 数据库.PS:更多可能是我个人的笔记总结记录,仅供参考 一.优化的内容 可以优化的内容,从范围的大小,可以 ...

  2. 知名游戏引擎公司Havok发布免费3D移动游戏引擎“Project Anarchy”

    自EA发布“寒霜”引擎(Frostbite Engine)移动版后,知名游戏引擎公司Havok也发布了免费的3D移动游戏引擎“Project Anarchy”. 据悉,6月底时候,Intel旗下知名游 ...

  3. [luoguP3355] 骑士共存问题(二分图最大独立集)

    传送门 模型 二分图最大独立集,转化为二分图最大匹配,从而用最大流解决. 实现 首先把棋盘黑白染色,使相邻格子颜色不同. 把所有可用的黑色格子看做二分图X集合中顶点,可用的白色格子看做Y集合顶点. 建 ...

  4. CORS跨域请求总结

    CORS跨域请求分为简单请求和复杂请求. 1. 简单请求: 满足一下两个条件的请求. (1) 请求方法是以下三种方法之一: HEAD GET POST (2)HTTP的头信息不超出以下几种字段: Ac ...

  5. 学习 WebService 第三步:一个简单的实例(RAD+WAS 8.5开发SOAP项目)

    [开发环境] Web Service 服务器端开发工具:RAD(Eclipse内核) Web Service 服务器:IBM WebSphere v8.5 REST/SOAP:SOAP(JAX-WS/ ...

  6. bzoj 1758 [Wc2010]重建计划 分数规划+树分治单调队列check

    [Wc2010]重建计划 Time Limit: 40 Sec  Memory Limit: 162 MBSubmit: 4345  Solved: 1054[Submit][Status][Disc ...

  7. samba安装和配置

    windows和windows系统之间要实现文件共享是通过网络邻居实现linux和windows之间通过什么来实现文件共享呢?一.通过文件挂载(首先要制作ISO镜像文件,然后在用挂载命令)二.通过sa ...

  8. docker的通俗理解

    自己买了个服务器,前不久搭建好的一个网站,想要再搞一个站点,无奈只能修改端口后,再部署另外一个站点.繁琐的配置运行环境,迁移网站,是否让你感觉到很繁琐?服务器不想用了,想搬迁到另外一台服务器去部署,先 ...

  9. BNU 12846 LCM Extreme 最小公倍数之和(线性欧拉筛选+递推)

    LCM Extreme Time Limit: 3000ms Memory Limit: 131072KB   This problem will be judged on UVALive. Orig ...

  10. net1:post,get方式传值,读写cookie,读XML文件,写script语句,跳转页面,response与request类

    原文发布时间为:2008-07-29 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...