KMP ์๊ณ ๋ฆฌ์ฆ ?
์ ์ฒด ๋ฌธ์์ด : ๋ฌธ์์ด ์ ์ฒด
ํจํด ๋ฌธ์์ด : ์ฐพ๊ณ ์ถ์ ๋ฌธ์์ด
- ์ ์ฒด ๋ฌธ์์ด์์ ์ผ์นํ๋ ํจํด ๋ฌธ์์ด์ ์ฐพ์์ผ ํ ๋ ์ฌ์ฉ
- ํจํด ๋ฌธ์์ด์ด ์ฌ๋ฌ ๋ฒ ์กด์ฌํ ์ ์๊ณ ๊ฐ๊ฐ ์ด๋ ์์น์ธ์ง ์ฐพ์์ผ ํ ๋
- ์ ๋์ฌ, ์ ๋ฏธ์ฌ์ ๊ฐ๋ ์ ํ์ฉํ์ฌ ๋ฐ๋ณต๋๋ ์ฐ์ฐ์ ์ค์ด๊ณ ๋งค์นญ ํ ๋ฌธ์์ด์ ์์น๋ก ๋น ๋ฅด๊ฒ ์ ํ
์ ์ฒด ์๊ฐ๋ณต์ก๋ O(n+m) : n = ์ ์ฒด ๋ฌธ์์ด์ ๊ธธ์ด, m = ํจํด ๋ฌธ์์ด์ ๊ธธ์ด
O(n^2)์ ๋ฌธ์์ด ํ์ ๋ฐฉ์์ ์ฌ์ฉํ ๊ฒฝ์ฐ๋ผ๋ฉด
for ( int i =0; i < ์ ์ฒด ๋ฌธ์์ด์ ๊ธธ์ด; i++) {
// text[i] : ์ ์ฒด ๋ฌธ์์ด ์ค i ๋ฒ์งธ ๋ฌธ์
bool flag = true
for ( int j =0; j < ํจํด ๋ฌธ์์ด์ ๊ธธ์ด; j++ ) {
// pattern[j] : ํจํด ๋ฌธ์์ด์ j ๋ฒ์งธ ๋ฌธ์
if ( text[i+j] != pattern[j]) flag = false;
}
if (flag) ํจํด ๋ฌธ์์ด ์ฐพ์๋ค !
}
ํ์ ์ค text[i + j] ๋ฒ์งธ ๋ฌธ์์ pattern [j]๊ฐ ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ )) text[i+1] ๊ณผ pattern[0] ๋ค์ ๋น๊ต
์ ์ฒด ๋ฌธ์์ด์ ํ์ํ ๋ถ๋ถ์ ๋ฐ๋ณตํด์ ๋ณด๊ณ ์ถ์ง ์๋ค
-> ํ์ํ ์ ๋ณด๋ฅผ ์ ์ฅํด๋์ผ๋ฉด ์๊ฐ์ ์ค์ผ ์ ์์ง ์์๊น => ์คํจ ํจ์
์คํจ ํจ์ ?
- ์ ์ฒด ๋ฌธ์์ด์ i ๋ฒ์งธ ๋ฌธ์์ ํจํด ๋ฌธ์์ด์ j ๋ฒ์งธ ๋ฌธ์๊ฐ ์ผ์นํ์ง ์์ ๊ฒฝ์ฐ ํจํด ๋ฌธ์์ด์ ๋ช ๋ฒ์งธ ๋ฌธ์๋ฅผ ๋ค์ ๋น๊ตํด์ผ ํ๋์ง ์๋ ค์ค๋ค
- ํจํด ๋ฌธ์์ด์ ์ฒ์๋ถํฐ j ๋ฒ์งธ๊น์ง์ ๋ฒ์๋ฅผ ๊ฐ์ง๋ ๋ถ๋ถ ๋ฌธ์์ด์์ ์ ๋์ฌ์ ์ ๋ฏธ์ฌ๊ฐ ์ผ์นํ๋ ์ต๋ ๊ธธ์ด ๊ฐ์ ๊ฐ์ง๋ ๋ฐฐ์ด์ ๋ง๋ ๋ค
pi ๋ฐฐ์ด = ๋ถ๋ถ ๋ฌธ์์ด์์ ์ ๋์ฌ์ ์ ๋ฏธ์ฌ๊ฐ ์ผ์นํ๋ ์ต๋ ๊ธธ์ด ๊ฐ์ ๊ฐ์ง๋ ๋ฐฐ์ด
pi ๋ฐฐ์ด์ ๋ง๋๋ ์คํจ ํจ์ ์ฝ๋
์๊ฐ๋ณต์ก๋ O(m) : m = ํจํด ๋ฌธ์์ด์ ๊ธธ์ด
vector <int> getPi(string pattern) {
int m = (int)pattern.length(), j = 0;
vector <int> pi(m, 0);
for (int i = 1; i < m; i++) {
while (j > 0 && pattern[i] != pattern[j])
j = pi[j - 1];
if (pattern[i] == pattern[j])
pi[i] = ++j;
}
return pi;
}
KMP ์๊ณ ๋ฆฌ์ฆ์ ํ๋ฆ
- ์คํจ ํจ์๋ฅผ ํตํด ์ ๋์ฌ์ ์ ๋ฏธ์ฌ์ ์ผ์นํ๋ ์ต๋๊ธธ์ด๋ฅผ ์ ์ฅํ ๋ฐฐ์ด ๋ง๋ค๊ธฐ
- ์คํจ ํจ์๋ฅผ ํตํด ๋ง๋ ๋ฐฐ์ด์ ์ด์ฉํ์ฌ ์ ์ฒด ๋ฌธ์์ด๊ณผ ํจํด ๋ฌธ์์ด์ ๋งค์นญ
1 ๋ฒ์ ์์์ ํด๊ฒฐ !
2 ๋ฒ ๊ณผ์ ์ ์ดํด๋ณด์
๋ฌธ์์ด ๋งค์นญ ๊ณผ์
- ์ ์ฒด ๋ฌธ์์ด์ ์ธ๋ฑ์ค i ์์น์ ๋ฌธ์์ ํจํด ๋ฌธ์์ด์ ์ธ๋ฑ์ค j ์์น์ ๋ฌธ์๋ฅผ ๋น๊ต
- ๋ ๋ฌธ์๊ฐ ๊ฐ๋ค๋ฉด )
- j ์ i ๋ชจ๋ 1์ฉ ์ฆ๊ฐํ์ฌ ๋ค์ ๋ฌธ์ ๋น๊ต
- ์ด๋ , j๊ฐ ํจํด ๋ฌธ์์ด์ ๋ง์ง๋ง ๊ธ์๋ผ๋ฉด j = pi[j]
- ๋ ๋ฌธ์๊ฐ ๋ค๋ฅด๋ค๋ฉด )
- j == 0 ์ด ๋๊ฑฐ๋ ๋น๊ตํ๋ ๋ ๋ฌธ์๊ฐ ๊ฐ์ ๋ ๊น์ง ๋ฐ๋ณต
- j = pi [ j - 1 ]
- ๋ฐ๋ j ์์น์ ๋ํด i ์์น ๋ฌธ์์ ๋ค์ ๋น๊ต
- j == 0 ์ด ๋๊ฑฐ๋ ๋น๊ตํ๋ ๋ ๋ฌธ์๊ฐ ๊ฐ์ ๋ ๊น์ง ๋ฐ๋ณต
- ๋ ๋ฌธ์๊ฐ ๊ฐ๋ค๋ฉด )
๋ฌธ์์ด ๋งค์นญ ๊ณผ์ ์ฝ๋
์๊ฐ๋ณต์ก๋ O(n+m) : n = ์ ์ฒด ๋ฌธ์์ด์ ๊ธธ์ด, m = ํจํด ๋ฌธ์์ด์ ๊ธธ์ด
void KMP (string text, string pattern) {
int j =0;
auto pi = getPi(pattern);
for (int i=0; i < text.size(); i++){
while (j > 0 && text[i] != pattern[j])
j = pi[j - 1];
if (text[i] == pattern[j]) {
if (j == pattern.size() - 1) //ํจํด ์ฐพ์
j = pi[j];
else j++;
}
}
}
์์
๋
์ฌ์ง ์ถ์ฒ ) ๊น์์ธ ์๋ง
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค/python] ๋ถ๋ ์ฌ์ฉ์ (0) | 2022.03.25 |
---|---|
c++ vector / python list ํจ์ ์ ๋ฆฌ (0) | 2022.03.25 |
[์๋ฃ๊ตฌ์กฐ] Trie ํธ๋ผ์ด (0) | 2021.01.17 |