問5 P="abcdabc"のとき、kmp 法の失敗関数f(i)を求めよ。 X XY a a f(1) = 0 (最初の文字から一致しないときは、0) aX aX f(2) = 1 (1文字一致して、2文字目で不一致。Xに ab ab 何番目の文字で再開するか) abX abX f(3) = 1 abc abc abcX abcX f(4) = 1 abcd abc abcdX abcdX f(5) = 1 abcda a abcdaX abcdaX f(6) = 2 abcdab ab abcdabX abcdabX f(7) = 3 abcdabc abc
問6 T = ababd ababc cbdca bcadb (n=20) 問5から P = abcdabc (m=7) a b c d a b c i 1 2 3 4 5 6 7 f(i) 0 1 1 1 1 2 3 失敗関数は、「Pがiの位置で失敗したら、次は、jの位置にPのどのi番目をもってきて、マッチングを再開するか」を値とする。 Text側のjは後戻りしないことに注意 (以下、j =< n-m の間だけ、調べるとした方がうまい) (つまり、残り6文字になったら、もう比較しないで失敗。その場合の解答は、kmpは22回、naiveは 27回) (ただし、教科書の疑似コードは、こうなっていないし、先週のnaive関数課題の解答例も、標準はこうなっていない。 このような解答をする場合は、どのようにカウントしたのかを、レポートに書いて示すほうがよい) (2022年度コメント)、 kmpでマッチング ababdababccbdcabcadb abc 3 (j=3, i=3で失敗。j=3の位置にi=1を) abc 3 (j=5, i=3で失敗。j=5の位置にi=1を) a 1 abc 3 abcd 4 (j=11, i=4で失敗。j=11の位置にi=1を。一番嬉しい動き) a 1 a 1 a 1 a 1 abcd 4 22 (ここで、やめるほうがうまい) ab 2 a 1 a 1 合計 比較回数は26 naiveでマッチング ababdababccbdcabcadb abc 3(j=3,i=3で失敗。j=2の位置にi=1。jも戻っているのがnaive) a 1 abc 3 a 1 a 1 abc 3 12 a 1 13 abcd 4 17 a 1 a 1 a 1 20 a 1 a 1 a 1 23 abcd 4 27 (ここで、やめるほうがうまい) a 1 a 1 ab 2 a 1 a 1 合計 33
問7 P = "tartar"とする。kmp 法の失敗関数f(i)を求めよ。 失敗関数f(i)を求める X XY t t f(1) = 0 (最初の文字から一致しないときは、0) tX tX ta ta f(2) = 1 taX taX tar tar f(3) = 1 tarX tarX tart tar f(4) = 1 tartX tartX tarta ta f(5) = 2 tartaX tartaX tartar tar f(6) = 3
問8 kmpの時間計算量を示せ
失敗関数が求められたあとのkmp法の計算量
たとえば、T="aaaaa", P="ab"(Pの失敗関数はf(1)=0, f(2)=1) aaaaa ab i=1, i=2, j = 1, j = 2 ab i=1, i=2, j = 3 ab i=1, i=2, j = 4 ab i=1, i=2, j = 5 a b i=1, i=2, j = 6 > n 終了 この場合、Tとの比較回数は2n - 1回 (9回) (下の場合も、aabと進んで、abと比較を繰り返すが、最悪ではない) aaaaa aab aab aab aa b (3+2+2+1 = 8回) aaaaa aaab aaab aaa b (4+2+1 = 7回)
Pの失敗関数を求めるアルゴリズムの計算量