νƒœκ·Έ 보관물: word-combinatorics

word-combinatorics

μ‹œκ°„μ˜ μ›Œλ“œ λΆ„ν•΄ κ·Έ μ•ˆμ—

두 개의 λ¬Έμžμ—΄ μ£Όμ–΄μ§€λ©΄ 연결을 μœ„ν•΄ λ₯Ό μ”λ‹ˆλ‹€ . λ¬Έμžμ—΄μ΄ μ£Όμ–΄ μ •μˆ˜ , μš°λ¦¬λŠ” λ¬Όν’ˆ 의 연결을 μœ„ν•΄ 사본 . 이제 λ¬Έμžμ—΄μ΄ 주어지면이 ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•˜μ—¬ β€˜μ••μΆ•β€™ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 즉 λŠ” 둜 μž‘μ„± 될 수 μžˆμŠ΅λ‹ˆλ‹€ . μ••μΆ• κ°€μ€‘μΉ˜λŠ” κ·Έ μ•ˆμ— λ‚˜νƒ€λ‚˜λŠ” 문자 수λ₯Ό λ‚˜νƒ€λ‚΄λ―€λ‘œ 의 κ°€μ€‘μΉ˜λŠ” 2이고 ( 의 μ••μΆ•) 의 λŠ” 3μž…λ‹ˆλ‹€ (κ°ˆλΌμ§„

S1,S2

S1S2

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

S[iβˆ’rpi1+1,iβˆ’pi1]=S[iβˆ’(rβˆ’1)pi1+1,i].

pi1

ri1

r

pi

Li=0

(piβ„“,riβ„“)

ν•˜μž 보닀 μ—„κ²©ν•˜κ²Œ 더 μž‘μ€ μ •μˆ˜ 만쑱 λ§ˆμ°¬κ°€μ§€λ‘œ

일뢀 μž…λ‹ˆλ‹€ . 이전과 λ§ˆμ°¬κ°€μ§€λ‘œ λ₯Ό κ³ μ • κ°€μ§„ μ΅œλŒ€ κ°’μœΌλ‘œ μ‚¬μš©ν•˜μ‹­μ‹œμ˜€ . 일반적으둜 은 보닀 μ—„κ²©ν•˜κ²Œ 큰 숫자 μž…λ‹ˆλ‹€. κ·ΈλŸ¬ν•œ 이 μž…λ‹ˆλ‹€.

pi2

(ri1βˆ’1)pi1

S[iβˆ’ri2pi2+1,iβˆ’pi2]=S[iβˆ’(ri2βˆ’1)pi2+1,i]

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))μž…λ‹ˆλ‹€.


λ‹΅λ³€