๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์•Œ๊ณ ๋ฆฌ์ฆ˜

[Algorithm] KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜

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. ์‹คํŒจ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋งŒ๋“  ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ์ „์ฒด ๋ฌธ์ž์—ด๊ณผ ํŒจํ„ด ๋ฌธ์ž์—ด์„ ๋งค์นญ

1 ๋ฒˆ์€ ์œ„์—์„œ ํ•ด๊ฒฐ !

2 ๋ฒˆ ๊ณผ์ •์„ ์‚ดํŽด๋ณด์ž

 

 

 

 

๋ฌธ์ž์—ด ๋งค์นญ ๊ณผ์ •

 

  • ์ „์ฒด ๋ฌธ์ž์—ด์˜ ์ธ๋ฑ์Šค i ์œ„์น˜์˜ ๋ฌธ์ž์™€ ํŒจํ„ด ๋ฌธ์ž์—ด์˜ ์ธ๋ฑ์Šค j ์œ„์น˜์˜ ๋ฌธ์ž๋ฅผ ๋น„๊ต
    1. ๋‘ ๋ฌธ์ž๊ฐ€ ๊ฐ™๋‹ค๋ฉด )
      • j ์™€ i ๋ชจ๋‘ 1์”ฉ ์ฆ๊ฐ€ํ•˜์—ฌ ๋‹ค์Œ ๋ฌธ์ž ๋น„๊ต
      • ์ด๋•Œ , j๊ฐ€ ํŒจํ„ด ๋ฌธ์ž์—ด์˜ ๋งˆ์ง€๋ง‰ ๊ธ€์ž๋ผ๋ฉด j = pi[j]
    2. ๋‘ ๋ฌธ์ž๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด )
      • j == 0 ์ด ๋˜๊ฑฐ๋‚˜ ๋น„๊ตํ•˜๋Š” ๋‘ ๋ฌธ์ž๊ฐ€ ๊ฐ™์„ ๋•Œ ๊นŒ์ง€ ๋ฐ˜๋ณต 
        • j = pi [ j - 1 ]
        • ๋ฐ”๋€ j ์œ„์น˜์— ๋Œ€ํ•ด i ์œ„์น˜ ๋ฌธ์ž์™€ ๋‹ค์‹œ ๋น„๊ต

 

 

 

๋ฌธ์ž์—ด ๋งค์นญ ๊ณผ์ • ์ฝ”๋“œ

์‹œ๊ฐ„๋ณต์žก๋„ 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++;
        }
    }
}

 

 

 

 

 

์˜ˆ์‹œ

๋

 

 

 

์‚ฌ์ง„ ์ถœ์ฒ˜ ) ๊น€์„œ์šธ ์—„๋งˆ

๋ฐ˜์‘ํ˜•