λ κ°μ λ¬Έμμ΄ μ£Όμ΄μ§λ©΄ μ°κ²°μ μν΄ λ₯Ό μλλ€ . λ¬Έμμ΄μ΄ μ£Όμ΄ μ μ , μ°λ¦¬λ λ¬Όν μ μ°κ²°μ μν΄ μ¬λ³Έ . μ΄μ λ¬Έμμ΄μ΄ μ£Όμ΄μ§λ©΄μ΄ νκΈ°λ²μ μ¬μ©νμ¬ βμμΆβν μ μμ΅λλ€. μ¦ λ λ‘ μμ± λ μ μμ΅λλ€ . μμΆ κ°μ€μΉλ κ·Έ μμ λνλλ λ¬Έμ μλ₯Ό λνλ΄λ―λ‘ μ κ°μ€μΉλ 2μ΄κ³ ( μ μμΆ) μ λ 3μ λλ€ (κ°λΌμ§
S1,S2S1S2
S
kβ₯1
(S)k=SSβ―S
k
S
AABAAB
((A)2B)2
( ( A ) 2 B 2 ) ( A B ) 2 A A B A B A A
((A)2B2)(AB)2A
ABABA
A
λ€)μ λ³λλ‘ κ³μ°λ©λλ€.
μ΄μ μ£Όμ΄μ§ λ¬Έμμ΄μ βκ°λ²Όμ΄βμμΆ μ»΄ν¨ν μ λ¬Έμ λ₯Ό κ³ λ € ν¨κ» . μ½κ°μ μκ° νμ μ νν μ κ·Όλ²μ λ°λΌ λλ μμ μ€νλλ λͺ νν λμ νλ‘κ·Έλλ° μ κ·Όλ²μ΄ μμ΅λλ€.
S|S|=n
O(n3logβ‘n)
O(n3)
κ·Έλ¬λμ΄ λ¬Έμ λ₯Ό μκ°μ ν΄κ²°ν μ μλ€κ³ λ€μμ§λ§μ΄ μμ μ μννλ λ°©λ²μ λν μμ€λ₯Ό μ°Ύμ μλ μμ΅λλ€. ꡬ체μ μΌλ‘,μ΄ λ¬Έμ λ μ΅κ·Ό νλ‘κ·Έλλ° κ²½μ° λνμμ λ°μνμ΅λλ€ (λ¬Έμ K μ¬κΈ° , λ§μ§λ§ λ νμ΄μ§). λΆμνλ λμ μκ³ λ¦¬μ¦μ΄ μ μλμκ³ , λ§μ§λ§μ μμ¬ 2 μ°¨ κ²½κ³κ° μΈκΈλμμ΅λλ€ ( μ¬κΈ°μλ 4 λΆ νμ). μ¬νκ²λ λ°νμλ β볡μ‘ν λ¨μ΄ μ‘°ν©λ‘ μ 리βλ§μ μΈκΈ νμΌλ―λ‘ μ΄μ ν΄κ²°μ± μ μ°ΎκΈ° μν΄ μ¬κΈ°μ μμ΅λλ€.
O(n2logβ‘n) O(n3logβ‘n)λ΅λ³
λ΄κ° λΉμ μ μ€ν΄νμ§ μλλ€λ©΄, μ΅μ λΉμ© μΈμ λΆν΄λ λ€μκ³Ό κ°μ΄ μκ°μΌλ‘ κ³μ° λ μ μλ€κ³ μκ°ν©λλ€ .
O(n2)κ° μΈλ±μ€ iμ λν΄ λ€μκ³Ό κ°μ΄ λν μ¬λ¬ κ° μ κ³μ° ν©λλ€. νμ μ μκ°λλλ‘ μ μ μ΅μμΉ λ§μ‘±μ΄ νΉμ κ²½μ° μ΄μ΄ νΉμ±μ κ°μ§ κ°μ₯ ν° μ΄λκ²νμμμ€. κ·Έλ¬ν κ° μ‘΄μ¬ νμ§ μμΌλ©΄ μ€μ λν΄ 0 κ°μ΄ μμμ μ μ μμ΅λλ€.
(piβ,riβ)β=1,2,β¦
pi1β₯1
rβ₯2
pi1
ri1
r
pi
Li=0
(piβ,riβ)
νμ λ³΄λ€ μ격νκ² λ μμ μ μ λ§μ‘± λ§μ°¬κ°μ§λ‘
μΌλΆ μ λλ€ . μ΄μ κ³Ό λ§μ°¬κ°μ§λ‘ λ₯Ό κ³ μ κ°μ§ μ΅λ κ°μΌλ‘ μ¬μ©νμμμ€ . μΌλ°μ μΌλ‘ μ λ³΄λ€ μ격νκ² ν° μ«μ μ λλ€. κ·Έλ¬ν μ΄ μ λλ€.
pi2(ri1β1)pi1
ri2β₯2
ri2
pi2
piβ
(riββ1β1)piββ1
piβ
Li=ββ1
κ° μΈλ±μ€ iμ λν΄ κ°μ΄ κ³Ό ν¨κ» κΈ°ννμ μΌλ‘ μ¦κ° νκΈ° λλ¬Έμ μμ΅λλ€. ( μ΄ μ‘΄μ¬νλ κ²½μ° λ³΄λ€ μ격νκ² ν¬μ§ μκ³ μ΅μν λ³΄λ€ ν° κ²μ λλ€ . μ΄κ²μ κΈ°ννμ μΈ μ¦κ°λ₯Ό μ€μ ν©λλ€. )
Li=O(logβ‘(i+1))piβ
β
piβ+1
(riββ1)piβ
piβ/2
μ΄μ λͺ¨λ κ°μ΄ μ°λ¦¬μκ² μ£Όμ΄ μ‘λ€κ³ κ°μ νμμμ€. μ΅μ λΉμ©μ μ¬λ°
μ λν κ²μΌλ‘ μ΄ν΄λλ€ μ°λ¦¬κ° μ€μ . ν μ΄λΈμ μκ° μμ΅λλ€.
(piβ,riβ)
dp(i,j)=min{dp(i,jβ1)+1,minβ(dp(i,jβrjβpjβ)+dp(jβrjβpjβ+1,jβpjβ))}i>j
dp(i,j)=+β
O(n2+nβjLj)
μ°λ¦¬λ μ΄λ―Έ . κ·Έλ¬λ μ€μ λ‘ μ°λ¦¬κ° μ 체μ ν©κ³λ₯Ό 보면, λ λ μΉ΄λ‘μ΄ κ²μ μ¦λͺ ν μ μμ΅λλ€.
βjLj=O(βjlogβ‘(j+1))=Ξ(nlogβ‘n)μ λ°λμ μ λ―Έμ¬ νΈλ¦¬ (μ¦, μ μ λμ¬ νΈλ¦¬)λ₯Ό κ³ λ €νμμμ€. μ°λ¦¬λ ν©κ³ μ λν κ° κΈ°λΆκΈμ κ°μ₯μ리μ μ²κ΅¬νμ¬ κ° κ°μ₯μ리μ μ΅λ ν λ² μ²κ΅¬λ©λλ€. κ°κ°μ λ₯Ό νκ³ μͺ½μΌλ‘ μ΄λ νλ κ°μ₯μ리κΉμ§ μΆ©μ νμμμ€ . μ¬κΈ°μ λ ν΄λΉνλ μ λμ¬ νΈλ¦¬μ μ μ΄κ³ ncaλ κ°μ₯ κ°κΉμ΄ κ³΅ν΅ μ‘°μμ λνλ λλ€.
T(Sβ)S
βiLi
T(Sβ)
pij
nca(v(i),v(iβpij))
v(iβpij)
v(i)
S[1..i]
μ΄κ²μ μ λλ€. κ° μ μ λ―Έμ¬ νΈλ¦¬μ μνλ₯Ό ν΅ν΄ μκ° μμ κ³μ°ν μ μμ§λ§ κ΄μ¬μ΄μλ μ¬λμ λμ€μ νΈμ§ ν μΈλΆ μ¬νμ λ¨κ²¨ λ‘λλ€.
O(βiLi)=O(n)(pij,rij)
O(n+βiLi)
μ΄κ²μ΄ μλ―Έκ° μλμ§ μλ €μ£Όμμμ€.
λ΅λ³
κΈΈμ΄κ° n μΈ μ΄κΈ° λ¬Έμμ΄ Sκ° μμ΅λλ€. λ€μμ λ©μλμ μμ¬ μ½λμ λλ€.
next_end_bracket = n
for i in [0:n]: # main loop
break if i >= length(S) # due to compression
w = (next_end_bracket - i)# width to analyse
for j in [w/2:0:-1]: # period loop, look for largest period first
for r in [1:n]: # number of repetition loop
if i+j*(r+1) > w:
break r loop
for k in [0:j-i]:
# compare term to term and break at first difference
if S[i+k] != S[i+r*j+k]:
break r loop
if r > 1:
# compress
replace S[i:i+j*(r+1)] with ( S[i:i+j] )^r
# don't forget to record end bracket...
# and reduce w for the i-run, carrying on the j-loop for eventual smaller periods.
w = j-i
ν΅μ¬ λ°©λ²μ΄ λͺ ννμ§ μμ μ€ν λ° μΈ μ€νμ λ§μ λ¨κ³κ° νμνκΈ° λλ¬Έμ μλμ μΌλ‘ βμλ λΈλν·βμ λν μΈλΆ μ¬νμ κ±°μ μ 곡νμ§ μμμ΅λλ€. μμ΄λμ΄λ 첫 λ²μ§Έ λ΄λΆμ μ΅μ’ μμΆμ ν μ€νΈνλ κ²μ λλ€. μλ₯Ό λ€μ΄ ABCBCABCBC => (ABCBC) Β² => (A (BC) Β²) Β².
μμ μ ν° κΈ°κ°μ λ¨Όμ μ°Ύλ κ²μ λλ€. S [i]λ β(β, β)βλλ μ λ ₯μ 건λ λ°λ Sμ i λ²μ§Έ νμ λλ€.
- i- 루νλ O (n)μ λλ€
- j- 루νλ O (n)
- r + k- 루νλ 첫 λ²μ§Έ μ°¨μ΄μμ λ©μΆ€μ λ°λΌ O (log (n))μ λλ€.
μ΄κ²μ μ μΈκ³μ μΌλ‘ O (nΒ²log (n))μ λλ€.