[ Algorithm/ KMP ์๊ณ ๋ฆฌ์ฆ ]๐จ๐ป๐ป programming/โฝ ์๊ณ ๋ฆฌ์ฆ2024. 7. 23. 16:39
Table of Contents
728x90
๋ฐ์ํ
" Algorithm/ KMP ์๊ณ ๋ฆฌ์ฆ "
๐ธ KMP( Knuth, Morris, Prett ) Algorithm?
๋ํ์ ์ธ ์์์๊ฐ ๋ด์ ํ ์ ์๋ ๋ฌธ์์ด ๊ฒ์ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๋ช ์นญ์ ์๊ณ ๋ฆฌ์ฆ ์ฐ์์์ ์๊ด์์ด ๋ง๋ ์ฌ๋์ด๋ฆ์ด๋ค. ๋ฌธ์์ด ๋งค์นญ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ๋ถ๋ฅด๋๊ฒ(?) ๋ ์ข์๊ฑฐ ๊ฐ๋ค.
๐ธ ํด๋ต
https://www.acmicpc.net/problem/1786
"baekjoon 1786๋ฒ - ์ฐพ๊ธฐ"์ ํจ๊ป kmp ์๊ณ ๋ฆฌ์ฆ์ ๋ฐฐ์ฐ๊ณ ํ์ด๋ณด์.
- P: ํจํด(๊ธธ์ด: m) T: ํ ์คํธ(๊ธธ์ด: n)
- ๋ง์ฝ ๋ชจ๋ ๋งค์นญ์ ํ๋ํ๋ ํ์ธํ๋ค๋ฉด? (n - m + 1) x m = ์๊ฐ ๋ณต์ก๋ O(nm)
- ๋ชฉํ: ์๊ฐ ๋ชฉ์ก๋ O(n) ๋ง๋ค๊ธฐ.
๐ฅ step 1. ์ฐพ์ผ๋ ค๋ ๋ฌธ์์ด ์ ์ฒ๋ฆฌ ๊ณผ์ ๊ฑฐ์น๊ธฐ
์ ๋์ฌ(์ด์ ์ : ๆฅ, ๋จธ๋ฆฌ ๋ : ้ ญ)์ ์ ๋ฏธ์ฌ(๊ผฌ๋ฆฌ ๋ฏธ : ๅฐพ) ์ต๋ ์ผ์น ๊ธธ์ด๋ฅผ ๊ตฌํ๊ธฐ.
โ ์ฐพ์ผ๋ ค๋ ๋จ์ด : ABCDABD
- ์ธ๋ฑ์ค [ i ]๋ฅผ ์ฆ๊ฐ์ํค๋ฉด์ ์ธ๋ฑ์ค[ j ]์ ๋์ผํ ๋จ์ด๊ฐ ์๋์ง ์ฐพ๋๋ค.
- ์ฐพ์๋ค๋ฉด [ i ]์ [ j ] ๋๋ค ์ฆ๊ฐ ์ํจ๋ค. j์ ์ธ๋ฑ์ค๋ ์ผ์น์ธ [ i ] ์ธ๋ฑ์ค ๋ฒ์งธ ์ซ์ ํ ์ด๋ธ์ ++j์ ์ ๋๋ค.
- ๋ง์ฝ ๋ค๋ฅธ ๋ถ๋ถ์ด ๋ฐ์ํ๋ค๋ฉด, j ๋ ์ซ์ ํ ์ด๋ธ[ j - 1 ]์ ์๋ฅผ j์ ์ ๋ ฅํ๋ค.
void makeTable( string Pattern)
{
int j = 0;
for(int i = 1; i < Pattern.size(); ++i)
{
while( j > 0 && Pattern[i] != Pattern[j] )
{
j = numberTable[ j - 1 ];
}
if(Pattern[i] == Pattern[j])
{
nuberTable[i] = ++j;
}
}
}
๐ฅ step 2. ๋ง๋ numberTable๋ก ๋ณธ๋ฌธ์์ ๋ฌธ์์ด ์ฐพ๊ธฐ
๋์๊ฐ ๋ง๋ค์ด๋ ์ซ์ ํ ์ด๋ธ์ ์ด์ฉํ์ฌ main Text์์ ์ฐพ๊ณ ์ ํ๋ ๋จ์ด๋ฅผ ์ฐพ์๋ณด์.
void KMP ( string mainText, string pattern )
{
int k = 0;
for(int i = 0 ; i < mainText.size(); ++i)
{
while( k > 0 && mainText[i] != pattern[k] )
{
k = numberTable[k - 1];
}
if( mainText[i] == pattern[k] )
{
if( k == mainText.size() - 1 )
{
k = numberTable[k];
}
else
{
k++;
}
}
}
}
728x90
๋ฐ์ํ
'๐จ๐ปโ๐ป programming > โฝ ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ Algorithm / ๋ฒจ๋ง ํฌ๋ ์๊ณ ๋ฆฌ์ฆ ] + ๋ฐฑ์ค 1865 ์ํ ๋ฌธ์ ํ์ด (2) | 2024.08.22 |
---|---|
binary search & lower bound & upper bound [c++ ๊ตฌํ] (0) | 2024.07.05 |
[Algorithm/ ๋นํธ๋ง์คํฌ] (4) | 2023.02.17 |
[Algorithm/ Sparse Table (ํฌ์ํ ์ด๋ธ)] ๋ฐฑ์ค 17435๋ฒ๊ณผ ํจ๊ป (0) | 2023.02.01 |
[Algorithm/Shortest Path] A* ์๊ณ ๋ฆฌ์ฆ - ๊ตฌํC++ (0) | 2022.06.20 |
@DoctorSunAhna :: ํํฌ์ฝ๋ฅ
์ ํ๋ ๊ฒ ๋ณด๋ค ๋ซ๊ฒ ์ง
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!