亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言中實現KMP算法的實例講解

2020-01-26 14:34:20
字體:
來源:轉載
供稿:網友

一般的算法為什么這么低效呢?那是因為主串指針回溯情況過多:
主串指針如果不回溯的話,速度就會加快,那我們就會想:
如何讓主串指針不回溯?
KMP算法就是解決了這個問題,所以速度變得更快速了。
它是這樣子的:
用一個數組:next[] 求得失配時的位置,然后保存下來。
要說清楚KMP算法,可以從樸素的模式匹配算法說起。 
樸素的模式匹配算法比較容易理解,其實現如下   

 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;    }   }  

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

具體請看如下程序:

#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX 101void 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 ;}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久这里只有精品| 日本不卡视频在线播放| 国产精品久久久久福利| 亚洲精品自拍偷拍| 高清一区二区三区日本久| 亚洲成年人在线播放| 亚洲精品一区久久久久久| 亚洲va欧美va国产综合剧情| 国产97在线视频| 日韩欧美一区二区三区久久| 午夜精品免费视频| 亚洲在线一区二区| 国产99视频在线观看| 国产精品无av码在线观看| 日韩小视频在线| 欧美福利小视频| 国产精品日日摸夜夜添夜夜av| 国产精品1234| 久久久人成影片一区二区三区| 欧美色xxxx| 91探花福利精品国产自产在线| 国产精品直播网红| 91精品国产高清久久久久久| 亚洲精品美女久久久| 国产原创欧美精品| 中文字幕日韩视频| 隔壁老王国产在线精品| 精品国产区一区二区三区在线观看| 久久影视电视剧免费网站清宫辞电视| 亚洲人成在线一二| 精品人伦一区二区三区蜜桃网站| 欧美久久精品一级黑人c片| 国产视频精品自拍| 国产精品毛片a∨一区二区三区|国| 91成人天堂久久成人| 中文字幕日韩在线视频| 国产精品av免费在线观看| 不卡毛片在线看| 欧美成人国产va精品日本一级| 久久伊人91精品综合网站| 成人自拍性视频| 中文字幕亚洲色图| 日本精品久久久久久久| 97超碰国产精品女人人人爽| 精品美女久久久久久免费| 色综合色综合网色综合| 久久久国产视频| 成人黄色av免费在线观看| 91视频-88av| 国产成人精品免费久久久久| 欧美日韩国产二区| 日韩精品有码在线观看| 久久久亚洲精品视频| 亚洲视频999| 欧美日韩一区二区三区在线免费观看| 成人免费黄色网| 2023亚洲男人天堂| 亚洲日本欧美日韩高观看| 一个人看的www久久| 精品日本美女福利在线观看| 日韩成人中文字幕在线观看| 一区二区三区高清国产| 日韩成人中文字幕| 国产欧美一区二区三区视频| 久久久久久久久久久免费精品| 国产一区二区三区在线观看视频| 日韩精品视频免费专区在线播放| 午夜精品久久久久久99热| 91高清视频免费| 91在线看www| 成人激情视频在线| 7777精品视频| 精品女同一区二区三区在线播放| 日韩欧美有码在线| 精品久久久久久久久国产字幕| 亚洲成人网在线| 欧美大片在线看免费观看| 精品久久久久久久久中文字幕| 亚洲欧美激情精品一区二区| 午夜精品一区二区三区在线视频| 国产视频久久久| 国产精品爽爽爽爽爽爽在线观看| 成人免费视频xnxx.com| 国产不卡视频在线| 亚洲第一精品夜夜躁人人爽| 欧美日韩免费观看中文| 国产亚洲欧美视频| 日韩有码在线电影| 91免费人成网站在线观看18| 亚洲国产精品美女| 久久免费观看视频| 亚洲黄色av女优在线观看| 日韩av成人在线观看| 一本色道久久综合亚洲精品小说| 欧美一区二区三区……| 亚洲人成网站免费播放| 精品久久久一区| 欧美体内谢she精2性欧美| 国产z一区二区三区| 亚洲国产一区二区三区四区| 欧美性xxxxhd| 国产精品电影在线观看| 日韩欧美在线观看| 亚洲精品xxx| 成人中文字幕+乱码+中文字幕| 亚洲国产精品国自产拍av秋霞| 日日噜噜噜夜夜爽亚洲精品| 久久精品视频免费播放| 日韩欧美在线观看| 欧美精品一区三区| 久久国产精品视频| 亚洲电影免费在线观看| 成人国产精品一区二区| 国产亚洲精品久久久久久| 中文字幕日韩专区| 岛国av午夜精品| 成人网页在线免费观看| 日韩精品久久久久久久玫瑰园| 亚洲色图狂野欧美| 国产一区二区日韩精品欧美精品| 欧美精品久久久久久久久久| 亚洲欧美日本另类| 欧美特黄级在线| 91精品国产91久久久久久最新| 岛国av一区二区在线在线观看| 精品久久久在线观看| 亚洲女人被黑人巨大进入| 国产精品黄色影片导航在线观看| 97国产一区二区精品久久呦| 欧美国产日韩一区| 另类天堂视频在线观看| 亚洲黄色免费三级| 日韩一区二区三区国产| 欧美老女人性生活| 欧美最猛黑人xxxx黑人猛叫黄| 91亚洲国产成人精品性色| 永久免费精品影视网站| 国内精品伊人久久| 久久这里有精品| 国产成人精品亚洲精品| 欧洲成人免费视频| 日韩成人av网址| 亚洲第一天堂无码专区| 国内精品视频在线| 欧美日韩国产91| 久久亚洲精品视频| 精品福利一区二区| 国产一区二区三区在线播放免费观看| 欧美中文在线免费| 国产精品99久久久久久www| 国产在线视频2019最新视频| 成人网在线免费观看| 色爱精品视频一区| 日本久久91av| 亚洲va男人天堂| 一本大道久久加勒比香蕉| 91精品国产91久久久久福利| 欧美成人在线网站| 亚洲一区二区三区香蕉| 久久久久久91| 欧美激情aaaa| 在线性视频日韩欧美| 日韩欧美主播在线| 久久综合伊人77777蜜臀|