๐ค Dynamic Programming
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ์ด๋ ํฐ ๋ฌธ์ ๋ฅผ ์์๋ฌธ์ ๋ก ๋๋์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ๋ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
์ด๋ฒ ํฌ์คํ ์์๋ Edit Distance ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด Dynamic Programming์ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ๋ ๊ณผ์ ์ ์ ๋ฆฌํ์ต๋๋ค.
Edit Distance ๋ฌธ์ ๋ ์ด๋ค ๋จ์ด์ ๋น์ทํ ๋จ์ด๋ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ์ํ ์ ์์๊น? ๋ผ๋ ์๊ตฌ์ฌ์์ ์์๋์์ต๋๋ค.
์๋์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด Microsoft Word spell check ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๋น์ทํ ๋จ์ด๋ฅผ ์๋์ผ๋ก ์ถ์ฒํด์ค๋๋ค.
์ฐ๋ฆฌ๋ ์ด๋ฅผ Edit Distance๋ฅผ ํตํด ํด๊ฒฐํด๋ณด๊ฒ ์ต๋๋ค.
๐ Edit Distance
์์์ ์ด๋ค ๋จ์ด์ ๋น์ทํ ๋จ์ด๋ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ์ํ ์ ์์๊น์ ๋ํ ์๊ตฌ์ฌ์ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๋๋ค์ Edit Distance๋ฅผ ๋์ ํ์ต๋๋ค.
์ฆ, ๋น์ทํ๋ค๋ ๊ฒ์ ์ผ๋ง๋ '๊ฐ๊น๋'๋ผ๋ ๊ฒ๊ณผ ๊ฐ๋ค๊ณ ์๊ฐํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ ๋๋ค.
Edit distance๋ ๋ stiring์ด ์ผ๋ง๋ ๊ฐ๊น์ด ์ง๋ฅผ ๋ํ๋ด๋ ์ฒ๋์ ๋๋ค.
โ๏ธ Edit Distance ์ ์ํ๊ธฐ
String S1๊ณผ S2 ๊ฐ์ edit distance๋ S1์์ ์๋ 3๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฐ์ฐ์ ์ต์ํ ๋ช ๋ฒ ์ํํ์ฌ S2๋ฅผ ๋ง๋ค ์ ์๋๊ฐ๋ก ์ ์ํฉ๋๋ค.
1. Insertion(์ฝ์ )
S1์ symbol ํ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค
ex) MONDT → MONEDT
2. Deletion(์ ๊ฑฐ)
S1์ symbol ํ๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
ex) MONEDT → MONED
3. Substitution(๊ต์ฒด)
S1์ symbol ํ๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
ex) MONED → MONEY
์ฆ, String S1๊ณผ S2๊ฐ์ edit distance๋ S1์์ Insertion, Deletion, Substitution์ ์ต์ ๋ช ๋ฒ ์ํํ์ฌ S2๋ฅผ ๋ง๋ค ์ ์๋๊ฐ๋ก ์ ์ํฉ๋๋ค.
๋ํ distance ์ค ๊ฐ์ฅ ์์ ๊ฐ์ edit distance๋ก ์ ์ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด S1 = SNOWY, S2 = SUNNY๋ผ ํ๊ณ S1์์ S2๋ฅผ ๋ง๋ค ์ ์๋ ์ต์ ์ํ ํ์๋ฅผ ๊ตฌํด๋ณด๊ฒ ์ต๋๋ค.
case1) SNOWY → SSNOWY (insert S) → SSNOWNY (insert N) → SSNWNY (delete O) → SSNNY (delete W) → SUNNY (substitute S to U) → distance = 5.
case2) SNOWY → SUNOWY (insert U) → SUNOY (delete W) → SUNNY (substitute O to N) → distance = 3
์์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ์ค case2) ์ ๊ฒฝ์ฐ๊ฐ ๋ ์ ์ ์ฐ์ฐ์ ์ด์ฉํ์ฌ S1์ S2๋ก ๋ฐ๊พธ์์ต๋๋ค.
๋ํ case2) ๋ณด๋ค ๋ ์ ์ ์ฐ์ฐ์ ์ด์ฉํ์ฌ S1์ S2๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ์์ผ๋ฏ๋ก S1๊ณผ S2์ edit distance๋ 3์ด ๋ฉ๋๋ค.
โ๏ธ Gap Table
์ฐ๋ฆฌ๋ ์ด๋ฅผ table์ ์ด์ฉํ์ฌ ๋ํ๋ผ ์ ์์ต๋๋ค.
Case1) S1 ์ฑ์์ ธ ์๋ column : S1์์ deletion
Case2) S2 ์ฑ์์ ธ ์๋ column : S1์์ insertion
Case3) S1, S2 ๋ชจ๋ ์ฑ์์ ธ ์์ง๋ง symbol์ด ์๋ก ๋ค๋ฅธ colmn : S1์์ substitution
์ด ๋ S1๊ณผ S2์ edit distance๋ gap table์ Case1 + Case2 + Case3์ ์ํ column์ ๊ฐ์ ( = match ๋์ง ์๋ column์ ๊ฐ์ )
๐ DP๋ฅผ ์ด์ฉํ Edit Distance ๋ฌธ์ ํด๊ฒฐ
Dynamic Programming์ ์ด์ฉํ์ฌ Edit Distance ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด๋ณด๊ฒ ์ต๋๋ค.
์์ ์์์์ Gap Table์ ์ดํด๋ณด๋ฉด ๋ง์ง๋ง column์ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
Key Observation
์ด๋ฅผ ํตํด S1, S2 ์ gap table ์์ ๋ง์ง๋ง column ์ ์ ๊ฑฐํ table ์ ์ด์ ํด๋น๋๋ S1 ๊ณผ S2 ์ prefix ๊ฐ์ edit distance ๋ฅผ ๋ํ๋ธ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
ํด๋นํ๋ prefix๊ฐ์ edit distance๊ฐ ๋ ์งง๋ค๋ฉด ๊ทธ๊ฒ์ ํด๋นํ๋ Gap Table + ์ ๊ฑฐํ column ์ถ๊ฐ๋ฅผ ํตํด ๋ ์งง์ edit distance๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์ด๋ฅผ ํตํด S1๊ณผ S2์ edit distance๋ S1๊ณผ S2์ prefix๊ฐ์ edit distance์ ์ํด ๊ฒฐ์ ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด Edit[i , j]๋ฅผ ๋ prefix S1[1, ..., i] ์ S2[1, ..., j]๊ฐ์ edit distance๋ผ ํ๊ฒ ์ต๋๋ค.
์ด๋ฅผ ํตํด S1๊ณผ S2๊ฐ์ gap table์์ ๋ง์ง๋ง column์์ ์ผ์ด๋ ์ฐ์ฐ์ ๋ฐ๋ผ ๋ค์๊ณผ ๊ฐ์ recurrence relation์ ์๊ฐํ ์ ์์ต๋๋ค.
โ๏ธ Edit Distance Case์ ๋ฐ๋ฅธ ํด๊ฒฐ๋ฐฉ๋ฒ
case1 ) ๋ง์ง๋ง column์์ deletion์ด ์ผ์ด๋ ๊ฒฝ์ฐ.
๋ง์ง๋ง column์์ S1→S2๋ฅผ ์ํด deletion ์ฐ์ฐ์ด ์ผ์ด๋ฉ๋๋ค.
์ฆ, ํ ๋ฒ์ ์ฐ์ฐ์ด ์ถ๊ฐ๋๋ค๋ ๊ฒ์ ๋๋ค.
์ด๋ฅผ ์์ผ๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
$$Edit[i, j] = Edit[i-1, j] + 1$$
case2 ) ๋ง์ง๋ง column์์ insertion์ด ์ผ์ด๋ ๊ฒฝ์ฐ.
๋ง์ง๋ง column์์ S1→S2๋ฅผ ์ํด insertion ์ฐ์ฐ์ด ์ผ์ด๋ฉ๋๋ค.
์ฆ, ํ ๋ฒ์ ์ฐ์ฐ์ด ์ถ๊ฐ๋๋ค๋ ๊ฒ์ ๋๋ค.
์ด๋ฅผ ์์ผ๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
$$Edit[i, j] = Edit[i, j-1] + 1$$
case3 ) ๋ง์ง๋ง column์์ insertion์ด ์ผ์ด๋ ๊ฒฝ์ฐ.
๋ง์ง๋ง column์์ S1→S2๋ฅผ ์ํด substitution ์ฐ์ฐ์ด ์ผ์ด๋ฉ๋๋ค.
๋ง์ฝ S1[i] = S2[j]๋ผ๋ฉด ์ถ๊ฐ ์ฐ์ฐ์ ์งํํ์ง ์์๋ ๋ฉ๋๋ค.
ํ์ง๋ง S[i] != S2[j]๋ผ๋ฉด ์ถ๊ฐ ์ฐ์ฐ ํ ๋ฒ์ด ํ์ํฉ๋๋ค.
$$Edit[i, j] = Edit[i-1 j-1] + 1$$
$$Edit[i, j] = Edit[i-1, j-1] + 1$$
์์ ์ธ ๊ฐ์ง๋ฅผ ๋ฐํ์ผ๋ก Recurrence Relation์ ์ธ์ฐ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
|S1| = n, |S2| = m ์ด๋ผ๋ฉด S1๊ณผ S2์ edit distnce๋ Edit(n, m)์ด ๋ฉ๋๋ค.
๐ Memoization
DP๋ฅผ ์ฌ์ฉํ์ฌ Edit Distance ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด memoization์ ํ์ฉํ๊ฒ ์ต๋๋ค.
Structure
Edit Distance ๋ฌธ์ ์์ memoization๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์๋ ๋ชจ๋ 1 ≤ i ≤ n, 1 ≤ j ≤ m ์ ๋ํด Edit[i, j]๋ฅผ ์ ์ฅํด์ผ ํฉ๋๋ค.
2์ฐจ์ array๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ๊ฐ๋ค์ ์ ์ฅํ ์ ์์ต๋๋ค.
Dependency
Edit[i, j]๋ Edit [i-1, j], Edit[i, j-1], Edit [i-1, j-1] ์๋ง ์์กดํฉ๋๋ค.
์์ dependency๋ฅผ ๋ฐํ์ผ๋ก array๋ฅผ row-major order ๋๋ column-major order๋ก ๊ณ์ฐํ๋ฉด์ array๋ฅผ ์ฑ์๋๊ฐ๋ฉด ๋ฉ๋๋ค.
S1 : snow ์ S2 : sunny๋ฅผ ์์๋ก array๋ฅผ ์ฑ์๊ฐ๋ ๊ณผ์ ์ ํ์ด๋ณด๊ฒ ์ต๋๋ค.
์๋์ฝ๋
์ด๋ฅผ ์๋์ฝ๋๋ก ๋ํ๋ด๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
Time Complexity
memoization์ผ๋ก ์ธํด Edit array์ elementํ๋๋ฅผ ๊ตฌํ ๋๋ง๋ค $O(1)$์ ์๊ฐ์ด ์๋ชจ๋ฉ๋๋ค.
→ ์ด $O(nm)$์ ์๊ฐ์ด ์๋ชจ๋ฉ๋๋ค.
'Computer Science > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Algorithm] Dynamic Programming(5) - ํ๋ก์ด๋ ์์ฌ (Floyd-Warshall) (0) | 2022.11.20 |
---|---|
[Algorithm] Dynamic Programming(4) - ๋ฒจ๋งํฌ๋(Bellman-Ford) (0) | 2022.11.19 |
[Algorithm] Dynamic Programming(2) - LIS(Longest Increasing Subsequence) (0) | 2022.11.17 |
[Algorithm] Dynamic Programming(1) - Warm Up (0) | 2022.11.15 |
[Algorithm] ๋ถํ ์ ๋ณต(4) - Selection (0) | 2022.10.20 |