最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中實(shí)現(xiàn)KMP算法的實(shí)例講解

 更新時(shí)間:2016年06月03日 09:40:54   作者:努力奔跑的羊  
KMP算法即字符串匹配算法,C語言中KMP可以避免指針回溯從而達(dá)到高效,接下來就來總結(jié)一下C語言中實(shí)現(xiàn)KMP算法的實(shí)例講解

一般的算法為什么這么低效呢?那是因?yàn)橹鞔羔樆厮萸闆r過多:
主串指針如果不回溯的話,速度就會(huì)加快,那我們就會(huì)想:
如何讓主串指針不回溯?
KMP算法就是解決了這個(gè)問題,所以速度變得更快速了。
它是這樣子的:
用一個(gè)數(shù)組:next[] 求得失配時(shí)的位置,然后保存下來。
要說清楚KMP算法,可以從樸素的模式匹配算法說起。 
樸素的模式匹配算法比較容易理解,其實(shí)現(xiàn)如下   

 int  Index(char  s[],  char  p[],  int  pos) 
 {  
  int  i,  j,  slen,  plen;  
  i  =  pos;  
  j  =  0;  
  slen  =  strlen(s);  
  plen  =  strlen(p);  
  while((i  <  slen)  &&  (j  <  plen))  
  {  
   if((s[i]  ==  p[j]))  
   {  
    i++;  
    j++;  
   }  
   else  
   {  
    i  =  i-j+1;  
    j  =  0;    
   }  
  }  
  if(j  >=  plen)  
  {  
   return  (i-plen);  
  }  
  else  
  {  
   return  -1;  
  }  
 }  

  
可見,在樸素的模式匹配算法中,當(dāng)模式中的p[j]與主串中的s[i]不匹配時(shí),需要把主串的指針回溯到i-j+1的地方從新用s[i-j+1]跟p[0]進(jìn)行匹配比較。KMP算法的想法是,能不能不回溯主串的指針呢?這種想法基于如下事實(shí)的:p[j]!=s[i]前,p[0]~p[j-1]跟s[i-j]~s[i-1]是匹配的(這里j>0,也就是說在不匹配前已經(jīng)有匹配的字符了。否則如果j=0,則主串指針肯定不用回溯,直接向前變成i+1再跟p[0]比較就是了) 
  
p[j]!=s[i]前,p[0]~p[j-1]跟s[i-j]~s[i-1]是匹配的,這說明了什么呢?這說明可以通過分析模式的p[0]~p[j-1]來分析s[i-j]~s[i-1]。如果模式中存在p[0]~p[k-1]=p[j-k]~p[j-1](共k個(gè)匹配的字符,且k是滿足這個(gè)關(guān)系的最大值),則可以知道s[i-k]~s[j-1]跟[0]~p[k-1]是匹配的,那么,s[i]只需要跟p[k]進(jìn)行比較就行了。而這個(gè)k是跟主串無關(guān)的,只需要分析模式串就可以求出來(這就是普通的教材中next[j]=k這個(gè)假設(shè)的由來,普通教材中總喜歡假設(shè)這個(gè)k值已經(jīng)有了,如果你邏輯思維強(qiáng)還沒有什么,不然或多或少會(huì)把你卡在這的)。亦即next[j]=k。 
  
如果上述的p[0]~p[k-1]=p[j-k]~p[j-1]串不存在會(huì)怎么樣呢?這說明p[j]前的串中不存在p[0]...=...p[j-1]的情況,就連p[0]也不等于p[j-1],也就是說p[0]~p[j-1]中所有以p[j-1]為結(jié)尾的子串跟模式p都是失配的?;谏厦鎝[0]~p[j-1]=s[i-j]~s[i-1]的事實(shí),可以斷定s[i-j]~s[i-1]中所有以s[i-1]結(jié)尾的子串跟模式p都是失配,這說明把主串的指針回溯到i-j+1~i-1都是沒有必要的,既然沒有必要回溯,而s[i]!=p[j],則s[i只能跟p[0]進(jìn)行比較匹配了。亦即next[j]=0。 
  
特殊情況下,j=0,即s[i]!=p[0],這時(shí)不用再用s[i]來跟p中的其它字符比較了,變成用s[i+1]跟p[0]進(jìn)行比較。為了統(tǒng)一,可以讓next[0]=-1。在下一輪的比較中,判斷到j(luò)=-1的情況時(shí),讓i=i+1,j=j+1,自然就形成s[i+1]跟p[0]比較的效果了。  
 
KMP算法實(shí)現(xiàn)示例

具體請(qǐng)看如下程序:

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

#define MAX 101


void get_next( int *next,char *a,int la) /*求NEXT[]的值*/
{
   int i=1,j=0 ;
   next[1] = 0 ;
   
   while ( i <= la) /*核心部分*/
   {
      if( a[i] == a[j] || j == 0 )
      {
        j ++ ;
        i ++ ;
        if( a[i] == a[j])
        next[i] = next[j];
        else
        next[i] = j ;
      }
      else
      j = next[j] ;
   }
}

int str_kmp( int *next, char *A ,char *a, int lA,int la)/* EASY*/
{
   int i,j,k ;
   i = 1 ;
   j = 1 ;
   while ( i<=lA && j <= la )
   {
      if(A[i] == a[j] || j == 0 )
      {
          i ++ ;
          j ++ ;
      }
      else
      j = next[j] ;
   }
   
   if ( j> la)
   return i-j+1 ;
   else
   return -1 ;
}

int main(void)
{
  int n,k;
  int next[MAX]={0} ;
  int lA=0,la =0 ;
  char A[MAX],a[MAX] ;
  scanf("%s %s",A,a) ;
  
  lA = strlen(A);
  la = strlen(a);
  for(k=la-1; k>= 0 ;k --)
  a[k+1] = a[k] ;
  for(k=lA-1; k>= 0 ;k --)
  A[k+1] = A[k] ;
  
  get_next(next,a,la) ;
  k = str_kmp(next,A,a,lA,la);
  if ( -1 == k)
  printf("Not Soulation!!! ");
  else
  printf("%d ",k) ;
  system("pause");
  
  return 0 ;
}

相關(guān)文章

  • C語言實(shí)現(xiàn)日志備份守護(hù)進(jìn)程的示例詳解

    C語言實(shí)現(xiàn)日志備份守護(hù)進(jìn)程的示例詳解

    這篇文章主要為大家詳細(xì)介紹了如何使用C語言開發(fā)一個(gè)簡單的日志備份守護(hù)進(jìn)程,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • MinGW-w64 C/C++編譯器下載和安裝的方法步驟(入門教程)

    MinGW-w64 C/C++編譯器下載和安裝的方法步驟(入門教程)

    如果電腦沒有安裝MinGW-w64 C/C++編譯器,就無法運(yùn)行g(shù)cc命令,本文主要介紹了MinGW-w64 C/C++編譯器下載和安裝的方法步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C語言實(shí)現(xiàn)飛機(jī)售票系統(tǒng)

    C語言實(shí)現(xiàn)飛機(jī)售票系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)飛機(jī)售票系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++ vector及實(shí)現(xiàn)自定義vector以及allocator和iterator方式

    C++ vector及實(shí)現(xiàn)自定義vector以及allocator和iterator方式

    這篇文章主要介紹了C++ vector及實(shí)現(xiàn)自定義vector以及allocator和iterator方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++深入分析講解智能指針

    C++深入分析講解智能指針

    為了解決內(nèi)存泄漏的問題,C++中提出了智能指針。內(nèi)存泄漏的產(chǎn)生原因有很多,即使我們正確的使用malloc和free關(guān)鍵字也有可能產(chǎn)生內(nèi)存泄漏,如在malloc和free之間如果存在拋異常,那也會(huì)產(chǎn)生內(nèi)存泄漏。這種問題被稱為異常安全
    2022-05-05
  • c++連續(xù)輸入未知個(gè)數(shù)的數(shù)字操作

    c++連續(xù)輸入未知個(gè)數(shù)的數(shù)字操作

    這篇文章主要介紹了c++連續(xù)輸入未知個(gè)數(shù)的數(shù)字操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C語言實(shí)例上手深入理解操作符的使用

    C語言實(shí)例上手深入理解操作符的使用

    C 語言提供了豐富的操作符,有:算術(shù)操作符,移位操作符,位操作符,賦值操作符,單目操作符,關(guān)系操作符,邏輯操作符,條件操作符等。接下了讓我們?cè)趯?shí)例中練一下
    2022-05-05
  • c++ 虛函數(shù),虛表相關(guān)總結(jié)

    c++ 虛函數(shù),虛表相關(guān)總結(jié)

    這篇文章主要介紹了c++ 虛函數(shù),虛表的的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c++,感興趣的朋友可以了解下
    2021-03-03
  • C語言代碼詳細(xì)描述順序線性表

    C語言代碼詳細(xì)描述順序線性表

    這篇文章主要用代碼介紹了C語言線性表的順序線性表,對(duì)于學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法的朋友很有參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • C語言實(shí)現(xiàn)選擇題標(biāo)準(zhǔn)化考試系統(tǒng)

    C語言實(shí)現(xiàn)選擇題標(biāo)準(zhǔn)化考試系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)選擇題標(biāo)準(zhǔn)化考試系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評(píng)論

仁化县| 贵溪市| 家居| 临安市| 揭阳市| 盐城市| 安陆市| 藁城市| 毕节市| 福海县| 扎赉特旗| 铜陵市| 手机| 秀山| 河北省| 无极县| 彩票| 枣强县| 泰来县| 塔河县| 通河县| 新民市| 藁城市| 南充市| 古丈县| 贵港市| 开封县| 德安县| 河西区| 绿春县| 洪江市| 四平市| 徐水县| 东阿县| 抚顺市| 罗田县| 毕节市| 南皮县| 凭祥市| 峨眉山市| 栖霞市|