字符串的匹配算法——BF算法和KMP算法

字符串的匹配算法——BF算法和KMP算法

用途:搜索引擎、拼写检查、数据压缩等。


BF算法

算法输入:原文本串S、预查找串T

算法输出:返回值为S中与T匹配的子序列第一个字符的序号,即匹配成功。否则,匹配失败,返回值 0。

Brute-Force算法,简称为 BF算法,是一种简单朴素的模式匹配算法,常用于在一个主串 S 内查找一个子串 T 的出现位置。

它的核心思想与操作是:

  • 对于给定的主串 S 与子串T ,主串 S 的长度为 N,子串 T 的长度为 M ;

  • 首先,将 S[1] 和 T[1] 进行比较;

  • 若相等,则再比较 S[2] 和 T[2] ,一直到 T[M] 为止;

  • 若 S[1] 和 T[1] 不等,则 T 向右移动一个字符的位置,再依次进行比较;

算法的时空复杂度:若n为主串长度,m为子串长度,最坏情况是:m<,则算法复杂度O(n*m)

int Index(Sstring S,Sstring T,int pos)
{
    i=pos;
    j=1;
    while (i<=S[ 0 ] && j <=T[ 0 ])
        {
           if ( S[ i ]=T[ j ])
            {
                ++i;
                ++j;
            }
           else
            { 
                i=i-j+2;
                j=1; 
            }
        }
     if ( j>T[ 0 ])
        {
           return   i-T[0];
        }
       else 
        {
            return 0;
        }

}

KMP算法

 

算法输入:原文本串S、预查找串T,

算法输出:返回值为S中与T匹配的子序列第一个字符的序号,即匹配成功。否则,匹配失败,返回值 0。

KMP算法由三位设计实现者的名字首字母组成

它的核心思想与操作是:利用已经部分匹配的结果而加快模式串的滑动速度,且主串S的指针i不必回溯!可提速到O(n+m)

设计思想:先计算next数组,然后调Index_KMP实现。

1、定义next[j]函数,表明当模式中第j个字符与主串中相应字符“失配”时,在模式中需重新和主串中该字符进行比较的字符的位置。

void get_next(SString T, int &next[])
{
     i= 1; next[1] = 0; j = 0;   
     while( i

2、基于BF。

int Index_KMP (SString S,SString T, int pos) 
{      
       i= pos,j =1;
       while (iT[0])  return i-T[0];  /*匹配成功*/
       else   return 0; 	         /*返回不匹配标志*/
} 

算法的时空复杂度:设主串s的长度为n,模式串t长度为m,KMP算法中求next数组的时间复杂度为O(m),在后面的匹配中因主串s的下标不减即不回溯,比较次数可记为n,所以KMP算法总的时间复杂度为O(n+m)


KEY:

1、上述只介绍原理。实践过程中要设计好、定义好数据结构。才能使用。如果是程序语言的初学者可以加Q610551883或留言联系。2、next数组的next[n] 的计算方法:将前面n-1个字符,计算从首尾开始组成最大的相同子串的长度,如果找到,那么next值是该长度加1,否则next值是1。通俗来讲该数组的含义为字符串T的前后缀的最长匹配长度值加1。3、本文中的代码暂未进行规范化的书写,仅供大意和思路上的参考。


补充:

暂无。

你可能感兴趣的:(数据结构)