天天看點

模式比對BF、KMP、BM、SundayBF模式比對KMP模式比對BM模式比對Sunday 算法參考文獻:

BF模式比對

參考介紹

最好情況的複雜度為O(n+m);最壞情況的複雜度為O(n*m)

def strmatch(a,b):
    for i in range(len(a)):
        if len(a)<len(b):
            break
        index=i
        for j in range(len(b)):
            if a[index] == b[j]:
                index +=1
            elif a[index] !=b[j]:
                break
            if index-i==len(b):
                return i
    return False
a='abcdefgacd'
b='acd'
print(strmatch(a,b))

def strmatch(a,b):
    for i in range(len(a)):
        if b[0]==a[i]:
            if b==a[i:len(b)+i]:
                return i
    return False
a='abcdefgacd'
b='acd'
print(strmatch(a,b))

           

KMP模式比對

參考介紹 學習視訊

def dpnext(pat):
    dp=[0 for _ in range(len(pat))]
    for i in range(1,len(pat)):
        '''
        細節操作,dp[i]的值代表的其實就是從開頭有dp[i]個字元和最後的dp[i]個字元一緻
        如果要比較的話,其實就可以直接比較第i個字元與第dp[i-1]個字元是否相等,如果相等
        那麼dp[i]=dp[i-1]+1;不等的話也有兩種情況,如果首位相等則店鋪dp[i]=1
        否則的話就為0,而初始化的過程中就直接全部賦0,是以不用操作
        '''
        if pat[i]==pat[dp[i-1]]:
            dp[i]=dp[i-1]+1
        elif pat[i]==pat[0]:
            dp[i]=1
    dp.insert(0,-1)
    return dp[:-1]

def kmp(str,pat):
    next = dpnext(pat)
    i,j = 0,0
    while(i<len(str)):
        if str[i]==pat[j]:
            if j == len(pat) - 1:#j已經移動到了pat的最後且最後的字元也相等
                j = next[j]#之是以把j定位到這裡是因為他前面有next[j]個字元是相等的
                print("founf in {}".format(i - len(pat) + 1))#也可以選擇找到之後繼續查找列印
                # return i - len(pat) + 1 #可以選擇找到第一個就傳回
            else:
                i,j =i+1,j+1
        else:#之是以把j定位到這裡是因為他前面有next[j]個字元是相等的
            j=next[j]
        if j==-1:#例子abceabcd,abcd就可以了解了
            i, j = i + 1, j + 1
# print(kmp('abcdabcaaeabcdabcaa','abcdabcaa'))
print(kmp('abceabcd','abcd'))
           

BM模式比對

參考介紹   

Sunday 算法

參考介紹

參考文獻:

BF算法

KMP算法

BM算法

Sunday 算法

https://zhuanlan.zhihu.com/p/74885159

繼續閱讀