程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 擴大KMP算法(Extend KMP)

擴大KMP算法(Extend KMP)

編輯:關於C++

擴大KMP算法(Extend KMP)。本站提示廣大學習愛好者:(擴大KMP算法(Extend KMP))文章只能為提供參考,不一定能成為您想要的結果。以下是擴大KMP算法(Extend KMP)正文


擴大kmp既是求形式串和主串的每個後綴的最長公共前綴

即令s[i]表現主串中以第i個地位為肇端的後綴,則B[i]表現s[i]和形式串的最長公共前綴

明顯KMP是求s[i]=形式串長度的情形,所以,擴大KMP是對KMP的拓展

像求KMP的next數組一樣,我們先求A[i],表現形式串的後綴和形式串的最長公共前綴

然後再應用A[i]求出B[i]
解釋一下A的求法,B同理
如今我們請求A[i],且A[1]---A[i-1]曾經求出,設k,且1<=k<=i-1,並知足k+A[k]最年夜
所以T[k]--T[k+A[k]-1]=T[0]--T[A[k]-1],推出T[i]--T[k+A[k]-1]=T[i-k]--T[A[k]-1]
令L=A[i-k],若L+i-1<k+A[k]-1,由A是最長公共前綴知A[i]=L,不然,向後婚配,曉得字符串掉配
並響應更新k
時光龐雜度為線性O(m+n)

while(1+j<strlen(T)&&T[0+j]==T[1+j])
        j = j + 1;
 A[1]=j;
    int k=1;
    for(int i=2; i<strlen(T); i++)
    {
        int Len = k + A[k] - 1,L = A[i-k];
        if( L < Len - i + 1 )
            A[i] = L;
        else
        {
            j = max(0,Len -i +1);
            while(i+j<strlen(T)&&T[i+j] == T[0+j])
                j = j + 1;
            A[i] = j,k = i;
        }
    }
    j = 0;
    while(j<strlen(S)&&j<strlen(T)&&T[0+j]==S[0+j])
        j = j + 1;
    B[0] = j,k = 0;
    for(int i=1; i<strlen(S); i++)
    {
        int Len = k + B[k] - 1,L = A[i-k];
        if( L < Len - i + 1 )
            B[i] = L;
        else
        {
            j = max(0,Len -i +1);
            while(i+j<strlen(S)&&j<strlen(T)&&S[i+j] == T[0+j])
                j = j + 1;
            B[i] = j,k = i;
        }
    }
 ps:通俗的next是到這個開頭的,能和形式串婚配的長度,擴大kmp是以這個開首的能婚配的最年夜長度
pss:然後我簡略比擬了下kmp和擴大kmp http://www.isnowfy.com/kmp-and-extend-kmp/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved