1. 程式人生 > >KMP_next陣列應用_最小迴圈元

KMP_next陣列應用_最小迴圈元

    迴圈元: 如果一個字串S是由字串T重複k次構成, 則稱T是S的迴圈元, 長度最小的T稱為S的最小迴圈元, 此時k最大

    結論1: 字串S[0...n - 1]有長度為len的迴圈元的充要條件是len整除n且S[0...n - 1 - len] = S[len...n - 1]. (該結論較易證明, 此處不再贅述證明過程)

    結論2: 字串S[0...n - 1]的所有迴圈元的長度必為其最小迴圈元長度的整數倍

    證明: 假設字串S的最小迴圈元為C[0...u - 1](u > 1), S存在迴圈元D[0...v - 1], v > u, v \, mod \: u \equiv q

, q > 0,  顯然S至少由2個D連線而成, 且S至少由3個C連線而成, 且S[v...v + u - 1] = C[q]...C[u - 1]C[0]...C[q - 1] = C[0...u - 1], 也即如下等式組成立:

    C[0] = C[q]

    C[1] = C[q + 1]

    ......

    C[u - 1- q] = C[u - 1]

    C[u - q] = C[0]

    ......

    C[u - 1] = C[q - 1]

    根據上述等式組可得, 對所有0 <= i <= u - 1, 均有C[i] = C[(i + q) mod u], 設w為u和q的最大公約數, 如果w為1也即w和u互質, 那麼C[0] = C[q mod u] = C[2q mod u] = ... = C[(u - 1)q mod u], 假設存在a, b滿足: 0 =< a < b < u且aq mod u = bq mod u, 那麼

u | (b - a)q, 又u與q互質, 則u | (b - a), 這顯然與0 =< a < b < u矛盾, 因此0, q mod u, ..., (u - 1)q mod u兩兩不等,則C[0] = C[1] = ... = C[u - 1]這顯然與C為最小迴圈元矛盾, 因此w = 1不成立, 應有w > 1.

    設u = pw, w > 1, 考慮有C[i] = C[(i + q) mod u] = ... = C[(i + (p - 1)q) mod u], 0 <= i < w, 假設存在c,d滿足: 0 <= c < d < p

且(i + cq) mod u = (i + dq) mod u, 那麼u | (d - c)q, 故應有p | (d - c), 這顯然與0 <= c < d < p矛盾, 故i, (i + q) mod u,...,(i + (p - 1)q)  mod u兩兩不等. 另一方面, w | q, u = pw, 則u | pq, 故(i + pq) mod u \equiv i. 設集P_{i} = {C[i + jq] | 0 <= j < p}, 0 <= i < w

    設T = k + jq = gu + z, (0 <= k < w, j >= 0, g >= 0, 0 <= z < u), 因為w | q, w | u, 則T = i + rw,  u = tw, 則T = gtw + z

,T - gtw \equiv z mod w, 也即i \equiv z  mod w, 這表明集P_{i} = {C[i + jw] | 0 <= j < p}, 也就是說w是C的一個迴圈元, 這顯然與C為最小迴圈元矛盾, 因此w > 1亦不成立.

   綜上述,  S存在迴圈元D[0...v - 1], v > u, v mod u \equiv q, q > 0為假, 結論2得證.

   結論3: 如果字串S[0...n - 1]存在迴圈元, 那麼其迴圈元長度從小到大依次為, n - nex[n - 1], n - nex[nex[n - 1],...,

   證明: 採用證明結論2過程中得出的結論, 即將字串S的最小迴圈元循轉任意長度均與旋轉前不等, 即可證明此結論. 此處不再贅述證明過程.