BM法のサンプルコードを参考にしながら、アルゴリズムの意味とコードの動きを照らし合わせています。アルゴリズムの意味は理解できたつもりでいます。ただ、以下のコードの#####をつけた条件分岐のブロックを、アルゴリズムに照らした場合、どう解釈していいのかわかりません。
この#####の部分は、テキストとパターンが一致しない時の処理ですが、
skip[ord(txt[pt])] > len(pat) - pp:
↑この箇所は、どのような状況を評価できることになるのでしょうか。
この条件分岐の式の意味がわからないので、
pt += skip[ord(txt[pt])] として、
スキップテーブルの値分だけテキストの着目箇所を進める場合と、
pt += len(pat) - pp と
する場合の違いがわかりません。
Pyhton
1def bm_match(txt: str, pat:str) -> int: 2 skip = [None] * 256 3 for pt in range(256): 4 skip[pt] = len(pat) 5 for pt in range(len(pat)): 6 skip[ord(pat[pt])] = len(pat) - pt - 1 7 8 while pt < len(txt): 9 pp = len(pat) - 1 10 while txt[pt] == pat[pp]: 11 if pp == 0: 12 return pt 13 pt -= 1 14 pp -= 1 15 16 ##### 17 if skip[ord(txt[pt])] > len(pat) - pp: 18 pt += skip[ord(txt[pt])] 19 else: 20 pt += len(pat) - pp 21 22 return -1 23 24 25 26if __name__ == "__main__": 27 txt = "abcxdezaabababac" 28 pat = "abab" 29 30 print(txt) 31 print(pat) 32 print(bm_match(txt, pat))
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/02 07:09