http://http://pl-learning-blog.logdown.com/posts/1084611
failure function 的計算方式
for(int i = 1; i<P_len; i++) {
int tmp = f[i-1];
while (tmp && P[i] != P[tmp])
tmp = f[tmp-1];
if (P[i] == P[tmp])
f[i] = tmp + 1;
else
f[i] = 0;
}
一樣: f(i) = f(i-1) + 1
不一樣: ... 很難解釋, 舉個例子
abcabdxxxabcabc
000120xxx123453 <= f(i)
如果 c 是 d 的話, 則可以填入 6 因為從 b 接續下去, 就有 6 個字元一樣了 (abcabd)
但 c 不是 d , 於是我們找 b 的次佳解, 於是從 f[ b ] 找到 b , 且 b 記錄著次佳解 (ab)
因為 f[ b ] == 5 , 所以從 b 往前 5 個字元會跟從 b 往前 5 個字元一樣, 所以從 b 往下接續等同從 b 往下接續
但為什麼 b 會記錄次佳解 ?
因為在 b 沒有 abcab
我已經盡力解釋了 ...
全站熱搜