C#算法--------Boyer-Moore算法

原创 2004年10月20日 21:14:00

顾剑辉(solarsoft)

引言

任何有效的应用程序都要处理文本信息,诸如编辑、排版、信息检索、文档分析、知识发掘、语意识别等,这些均需用到文本串的提取和定位。在很多程序设计语言中都有现成的函数可以调用,为程序设计者提供了极大方便。

对于串查找,Robert S.BoyerJ.Strother Moore 1977年实现了一个非常高效的串查找算法BoyerMoore,使用简单的有限状态自动机FMS控制,在目标串中移动,FSM用一个数组来表示。

算法原理,我在这里不做详细的解说了.朋友们可以找找相关的资料.本人主要是参考Scott Robert Ladd著的Java Algorithms 中的BoyerMoore算法.

本文根据此算法介绍在C#中的实现。

算法测试结果如下图:

具体算法如下:

using System;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

namespace stringsearch

{

     /// <summary>

     /// 字符串搜索的基本抽象类

     /// </summary>

     public abstract class StringSearchTool

     {

         public enum Search

         {

            NOT_FOUND,

            SEARCH_EXACT,

            SEARCH_CASELESS

         }

        

         protected Search search;

 

        protected String pattern;

        

         public string Pattern

         {

              get

              {

                   return pattern;

              }

              set

              {

                 //大小写暂时无用处

                   if(search==Search.SEARCH_CASELESS)

                   {

                       pattern=value;

                       pattern.ToUpper();

                   }

                   else

                   {

                       pattern=value;

                      

                   }

              }

         }   

 

 

         public StringSearchTool()

         {

              search=Search.SEARCH_CASELESS;

              pattern=null;

         }

 

         public StringSearchTool(string p)

        {

             search=Search.SEARCH_CASELESS;

             pattern=p;

 

 

        }

 

 

       

        public StringSearchTool( string p,Search type)

       {

             search=type;

             pattern=p;

 

       }     

        public int getPatternLength()

       {

             return pattern.Length;

       }

 

         public Search getSearchType()

         {

              return search;

         }

 

         public int find(string target)

         {

          return find(target,0);

         }

 

         public abstract int find(string target, int start);

     }

}

 

BoyerMoore算法

using System;

 

namespace stringsearch

{

     /// <summary>

     ///

     /// </summary>

     public class BoyerMoore : stringsearch.StringSearchTool

     {

         protected int [] delta;

         private  static readonly int DELTA_SIZE=65536;

 

         public BoyerMoore():base()

          {

             

         }

         public BoyerMoore(string p):base(p)

         {

             

         }

         public BoyerMoore(string p,Search type):base(p,type)

         {

             

         }

 

 

         public override int find(string target,int start)

         {

              if((pattern==null)||(start<0))

                   return (int)Search.NOT_FOUND;

 

              String target2;

              //if(search==Search.SEARCH_CASELESS)

              //   target2=target.ToUpper();

              //else

                   target2=target;

 

              int t=start+pattern.Length;

 

              while(t<=target2.Length)

              {

                   int p=pattern.Length;

 

                   while(pattern[p-1]==target2[t-1])

                   {

                       if(p>1)

                       {

                            --p;

                            --t;

                       }

                       else

                       {

                            return t-1;

                       }

                   }

                   t+=delta[(int)target2[t-1]];

              }

              return (int)Search.NOT_FOUND;

         }

 

         public  new string Pattern

         {

               get

              {

                   return base.Pattern;

              }

               set

              {

                  base.Pattern=value;

                  int n;

 

                   delta=new int[DELTA_SIZE];

 

                   for(n=0;n<DELTA_SIZE;++n)

                       delta[n]=pattern.Length;

 

                   for(n=1;n<pattern.Length;++n)

                       delta[(int)pattern[n-1]]=pattern.Length-n;

 

                   delta[(int)pattern[pattern.Length-1]]=1;

 

             }

         }

     }

}

测试代码(部分):

private void button1_Click(object sender, System.EventArgs e)

         {

            String terget=label1.Text;

            String pattern=textBox1.Text;

            BoyerMoore bm=new BoyerMoore();

            bm.Pattern=pattern;

            if (bm.find(terget,0)>0)

            MessageBox.Show(this,"你是不是在找 "+pattern+" ?"+"恭喜你找到了!");

            else

            MessageBox.Show(this,"下面的这段话中没有找到你所查找的文字!");

         }

 

编译已通过,在上面的设计中有一些小的漏洞,朋友可以修改以下.

BM算法(Boyer-Moore) (JAVA实现)

BM算法时间上也是O(M+N),而且可以跳着search,但不适合characterset 太小的状况; BM算法主要涉及两个主要步骤:BadCharacter rule 和 Good Suffix ...
  • u013035314
  • u013035314
  • 2015年12月14日 23:43
  • 1677

多数投票算法(Boyer-Moore Algorithm)详解

多数投票算法(Boyer-Moore Algorithm)详解
  • kimixuchen
  • kimixuchen
  • 2016年10月11日 19:08
  • 2273

字符串搜索算法Boyer-Moore的Java实现

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...
  • nmgrd
  • nmgrd
  • 2016年06月17日 09:23
  • 3020

Horspool‘s算法和Boyer-Moore算法

在上述BARBER比较中(详细见Introduction to the Design and Analysis of Algorithms (3th)英文版P262)。原本以为在倒数第二次比较时,R匹...
  • Incy_1218
  • Incy_1218
  • 2014年05月22日 00:10
  • 906

Boyer Moore 算法的C++实现以及一些独特的感受

关于Boyer Moore算法的实现,小弟我折腾了1周多终于成功了!!! 本人研究了这篇论文:"1977, A fast String Searching Algorithm",总结出以下几个要点:...
  • u014085000
  • u014085000
  • 2014年03月26日 23:35
  • 874

Boyer–Moore–Horspool文本匹配算法(BM算法的简化版)

英语里有句习语叫"find a needle in a haystack",译成中文叫"大海捞针"(原意是在一堆干草中寻找一根针)。计算机中的文本匹配(string matching)就是要解决怎样在...
  • ljsspace
  • ljsspace
  • 2011年06月19日 13:02
  • 7995

比KMP高效的Boyer-Moore字符串匹配算法

在这里我所要想说的比KMP算法高效的算法是Boyer-Moore算法。        在讲解Boyer-moore算法之前,在这里先回顾一下KMP算法。        比如说有一个字符串"BBC ...
  • leex_brave
  • leex_brave
  • 2016年07月07日 20:15
  • 544

Boyer-Moore算法Java实现

关于算法的说明可以看 http://baike.baidu.com/link?url=-w9_47V9JJlgQLlEoFyXvxqBc97Zd281elktWQeTr0I-GgV8M3RK_oSkv...
  • zs064811
  • zs064811
  • 2017年04月09日 12:23
  • 289

Boyer-Moore算法

Boyer-Moore 算法形象描述: Boyer-Moore算法不仅效率高,而且构思巧妙,容易理解。1977年,德克萨斯大学的Robert S. Boyer教授和J Strother Moore教...
  • wonengxing
  • wonengxing
  • 2013年08月20日 11:30
  • 430

Boyer-Moore算法(BM) and Sunday算法

好的讲解 淘宝讲解 南柯一喵 Treant Boyer-Moore算法 明确几个概念: 坏字符:模式串的尾部第一个不匹配字符。 好后缀:尾部所有匹配的字符 ...
  • huatian5
  • huatian5
  • 2016年08月10日 17:07
  • 181
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#算法--------Boyer-Moore算法
举报原因:
原因补充:

(最多只允许输入30个字)