1. 程式人生 > >對基本KMP演算法的理解

對基本KMP演算法的理解

kmp演算法是在bf(暴力搜尋)演算法的基礎上進行優化,以減少重複操作,降低時間複雜度的一種字串匹配演算法。
kmp演算法的思想
如何搜尋某字串的子串?暴力搜尋的思想是將子串的第一個元素s[0]與a[0]匹配,如果成功則判斷s[1]與a[1],否則s向右移動一位,即判斷s[0]與a[1]是否匹配,之後同上。kmp演算法的思想是利用之前已經匹配過的資料,移動子串,使子串與之前匹配成功相同的字首匹配,跳過不必要的判斷。
這裡寫圖片描述
這裡寫圖片描述
這個子串所匹配的字首是A C,則下一次只需要對準主串中含有A C的位置重新開始匹配。
next函式
如何知道應該子串應該跳到哪個位置?我們可以設定一個next陣列,存放符合條件字首的位置。
next[i]的值k,代表子串包括第[i]個字元的最長相同子串(或者說相同的字首和字尾)。
子串中str[0]=str[i-k]
············str[k-1]=str[i-1];
而當str[i]!=str[k],即匹配失敗時,我們要尋找到str[next[k-1]-1]作為這個str[k-1],這時再看str[k]能否和str[i]匹配。所以這實際上就是一個遞迴的過程。

 void next(char *str,int next[])
  {
      int i=1,k=-1;
      next[0]=-1;
      for (; i<strlen(str);i++)
      {
         while(k!=0&&str[k]!=str[i])
            k=next[k-1];
        if (str[k]==str[i])
            k++;
         next[i]=k;
     }
 }