sundayアルゴリズムのpythonは実現します.

1744 ワード

同じ文字列を検索するアルゴリズムです.Sundayは本当にKMPよりずっと簡単です.
理解も簡単です.
下の文字は分かりにくいかもしれません.このブロガーのブログを参考にして、「文字列マッチング——Sundayアルゴリズム」を理解してください.https://blog.csdn.net/q547550831/article/details/51860017 文字列Aがあると仮定して、比較文字列BにAがBを含むかどうかを調べる必要があります.
  • は、Aのi位置とBの0位置を揃え、iは0から開始する.
  • A[i]要素とB[0]が同じであれば、Aの次の要素とBの次の値を比較し続け、lenを比較する.(B)次は、Aの文字列がBであるかどうかを見ることです.終了しました.もちろん、そうではないなら、Bを後ろに移動して、Aの後ろの位置に揃えるべきです.暴力的な方法はBが後ろに移動する度に、Aと比較します.KMP/BM/Sundayはこれらのアルゴリズムは全部変位を計算します.できるだけ多くのスキップします.使用する元素は、比較の回数を減らします.
  • 第二のステップでi+len(B)−1までの比較過程で位置が異なる場合、直接にA[i+len(B)]がBにあるかどうかを見に行きます.もし違ったら、何を説明しますか?ここで、i位置に揃うAとBは異なることが分かりました.これでいいです.i+len(B)BがAのi+1から始まる位置にあると仮定すれば、A[i+len(B)]という値は必ずBに表示されます.[i+len(B)]はBにないので、反証A[i+1]からA[i+len(B)]の大きさは間違いなくBを含まずにスキップできます.その後、ステップ1に戻ります.
  • はもちろん、前のステップもA[i+len(B)]がBの中にあると仮定して、Bの最後からx番目の位置に現れます.i+1からAの文字列はBを含んでいるかもしれません.ここでは、一歩後に移動しなくてもいいです.直接Aのi+len(B)を.位置はBのx位置に合わせればいいじゃないですか?この時AはBと同じかどうかを判断します.これはまたステップ3、4に戻り、繰り返します.
  • 終了条件は、AにおいてBが見つかったか、または最後まで見つけられませんでした.最後の部分は、2つの文字列のしっぽがそろっていると比較すればいいです.つまり、len(A)−len(B)の位置です.
    def sunday_find(src, dst):
        len_src = len(src)
        len_dst = len(dst)
        i = 0
        while i < len_src - len_dst + 1:
            flag = 0
            shift = len_dst
            for j in range(0, len_dst):
                if src[i+j] != dst[j]:
                    flag = -1
                    break
    
            if flag == 0:
                return i
    
            p = dst.rfind(src[i+shift])
            if p == -1:
                shift = len_dst + 1
            else:
                shift = len_dst - p
    
            i = i + shift
    
        return -1
    
    
    if __name__ == "__main__":
        text = "here_examplfe_v_example"
        pattern = "ple"
        pos = sunday_find(text, pattern)
        print pos