์ด ์˜์—ญ์„ ๋ˆ„๋ฅด๋ฉด ์ฒซ ํŽ˜์ด์ง€๋กœ ์ด๋™
caputdraconis ๋ธ”๋กœ๊ทธ์˜ ์ฒซ ํŽ˜์ด์ง€๋กœ ์ด๋™

caputdraconis

ํŽ˜์ด์ง€ ๋งจ ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๊ธฐ

caputdraconis

๋„คํŠธ์›Œํฌ ๊ด€์ ์—์„œ์˜ ํด๋ผ์šฐ๋“œ ์ปดํ“จํŒ…์„ ๊ณต๋ถ€ํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค :)

[Algorithms] String(Pattern) Matching

  • 2023.06.01 00:18
  • ๐Ÿฅš๊ณ ๋ฆฌ์ฆ˜
๊ธ€ ์ž‘์„ฑ์ž: caputdraconis
๋ฐ˜์‘ํ˜•

String ์ด๋ž€

๊ธธ์ด๊ฐ€ 0 ์ด์ƒ์ธ Character ๋“ค์˜ ๋‚˜์—ด์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
๊ธธ์ด๊ฐ€ 0 ์ธ String ์€ "" ์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Empty String ์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.
๊ทธ์™€ ๋ฐ˜๋Œ€๋กœ, ๊ธธ์ด๊ฐ€ 1 ์ด์ƒ์ธ String ์€ Non-empty String ์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

String ์˜ ์˜ˆ์‹œ

- C++ Program : C++ ๋กœ ์ž‘์„ฑํ•œ .cpp ํŒŒ์ผ๋„ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- HTML Document : <html><h3>ํ˜ธํ˜ธ์ž‡!!</h3></html> ๊ณผ ๊ฐ™์ด ์šฐ๋ฆฌ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด์„œ ์›นํŽ˜์ด์ง€๋ฅผ ์ด์šฉํ•  ๋•Œ, ์‚ฌ์šฉ๋˜๋Š” HTML ํŒŒ์ผ๋„ ํ•˜๋‚˜์˜ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
- DNA Sequence : {A, C, G, T} ๋กœ ๊ตฌ์„ฑ๋œ ์—ผ๊ธฐ์„œ์—ด์˜ ๋‚˜์—ด๋„ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
- Digitized Image : ๋””์ง€ํ„ธ ์ด๋ฏธ์ง€๋Š” {0, 1} ๋กœ ๊ตฌ์„ฑ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.

Substring

๋ฌธ์ž์—ด P ์˜ Substring ์€, P[i, j] ์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. i์™€ j๋Š” Index ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
์ฆ‰ ์ „์ฒด ๋ฌธ์ž์—ด P ์˜ ์ผ๋ถ€๋ถ„์„ ์˜๋ฏธํ•˜๋ฉฐ, ๊ทธ ์ผ๋ถ€๋ถ„์ด P ์— ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Prefix of P : P ์˜ ์ ‘๋‘์‚ฌ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, P[i, j] ์—์„œ i ๊ฐ€ 0์œผ๋กœ ๊ณ ์ •๋œ ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. P ์˜ ์•ž๋ถ€๋ถ„์„ ์ž˜๋ผ์˜จ ํ˜•ํƒœ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. P์˜ ๊ธธ์ด๊ฐ€ m ์ด๋ผ๊ณ  ํ•  ๋•Œ, P ์˜ ์ ‘๋‘์‚ฌ๋Š” ์ด m ๊ฐœ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Suffix of P : P ์˜ ์ ‘๋ฏธ์‚ฌ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, P[i, j] ์—์„œ j๊ฐ€ m-1 ๋กœ ๊ณ ์ •๋œ ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. P ์˜ ๋’ท๋ถ€๋ถ„์„ ์ž˜๋ผ์˜จ ํ˜•ํƒœ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.์ ‘๋ฏธ์‚ฌ ๋˜ํ•œ ์ด m ๊ฐœ ์กด์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Proper Prefix/Suffix of P : ์•ž์— Proper ์ด ๋ถ™์œผ๋ฉด ์ง„์ ‘๋‘์‚ฌ/์ง„์ ‘๋ฏธ์‚ฌ ๋ผ๊ณ  ํ•ด์„๋˜๋ฉฐ, ์ด๋Š” ์ „์ฒด ๋ฌธ์ž์—ด P ๋ฅผ ์ œ์™ธํ•œ ๊ฒฝ์šฐ๋“ค์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. P[0, m-2] ๊นŒ์ง€๋งŒ Proper Prefix, P[1, m-1] ๊นŒ์ง€๋งŒ Proper Suffix ์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์ „์ฒด ๋ฌธ์ž์—ด P์™€ ๊ฐ™์€ P[0, m-1] ์ด ํฌํ•จ๋˜๋ฉด ์ด๋Š” Proper Prefix/Suffix ๋ผ๊ณ  ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ „์ฒด ๋ฌธ์ž์—ด P ์ธ ๊ฒฝ์šฐ ํ•œ ๊ฐ€์ง€๊ฐ€ ๋น ์กŒ๊ธฐ์—,  ๊ฐ๊ฐ m-1 ๊ฐœ๊ฐ€ ์กด์žฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Pattern Matching Problem ์€ Text T ์™€ Pattern P ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, T์˜ Substring ์ค‘ P์™€ ๊ฐ™์€ ๊ฒƒ์ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. 


Brute-Force Algorithm

๋ชจ๋“  ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ๋ฅผ ์ฒดํฌํ•˜๋Š” ๋ฐฉ์‹์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, Character-by-Character Comparison ์„ ํ•ฉ๋‹ˆ๋‹ค.
Mismatch ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ๋ฌด์กฐ๊ฑด ํ•œ ์นธ์”ฉ๋งŒ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์›€์ง์ด๊ณ  ๋‹ค์‹œ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋น„๊ต๋ฅผ ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

Brute-Force Algorithm ์„ C++ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

#include <iostream>
#include <string>

using namespace std;

int BruteForceMatch(string T, string P) {
	/*
		T : ๊ธธ์ด๊ฐ€ n ์ธ Text
		P : ๊ธธ์ด๊ฐ€ m์ธ Pattern
        
        Input Size : n + m
	*/
	int n = T.length(), m = P.length();

	for (int i=0; i<=n-m; i++) { // i ๋Š” Text Index
		int j = 0; // Pattern index
		while (j < m && T[i + j] == P[j])
			j ++;
		if (j == m) // Pattern Matching!
			return i; // T[i] ๋ถ€ํ„ฐ Pattern ๋ฐœ์ƒ
	}
	return -1; // No Match
}

 

Worst Case

T = aaaaaaaaaaaaah
P = aaah
์ž…๋ ฅ์œผ๋กœ ๋“ค์–ด์˜จ ๋‘ ๊ฐœ์˜ ๋ฌธ์ž์—ด์ด ์œ„์™€ ๊ฐ™์„ ๋•Œ, ๋ฐ”๊นฅ ๋ฐ˜๋ณต๋ฌธ(i ๋ฐ˜๋ณต๋ฌธ) ํ•œ ๋ฒˆ์˜ ์‚ฌ์ดํด๋‹น ์ด m ๋ฒˆ์˜ ๋น„๊ต๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์‚ฌ์ดํด์ด n-m ๋ฒˆ์ด๋ฏ€๋กœ, O(m(n-m)) => O(nm) time ์— ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. 

 


KMP Algorithm

ํ’€๋„ค์ž„์€ Knuth-Morris-Pratt's Algorithm ์ž…๋‹ˆ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Brute-Force Algorithm ์—์„œ ๋ฐœ์ƒํ–ˆ๋˜ ์ค‘๋ณต๋˜๋Š” ๋น„๊ต ์—ฐ์‚ฐ์„ ์ค„์ด๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ ํ•œ ์นธ์”ฉ๋งŒ Shift ํ–ˆ๋˜ Brute-Force Algorithm ๊ณผ ๋‹ค๋ฅด๊ฒŒ, ์—ฌ๋Ÿฌ ์นธ์„ Shift ํ•ฉ๋‹ˆ๋‹ค.

Mismatch ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์ค‘๋ณต ๋น„๊ต ์—ฐ์‚ฐ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉฐ ์˜ฌ๋ฐ”๋ฅธ Pattern Matching ๊ฒฐ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ Shift ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. 

KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํŒจํ„ด์„ Preprocessing(์ „์ฒ˜๋ฆฌ) ํ•˜๋ฉฐ, Mismatch ๋ฐœ์ƒ ์‹œ ๋ช‡ ์นธ์„ Shift ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•ด๋†“์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ failureFunction F(j) ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š”, P[0, j] ์˜ Prefix ์™€ P[1, j] ์˜ Suffix ๊ฐ€ ๊ฐ™์€ ๊ฒƒ๋“ค ์ค‘ ๊ฐ€์žฅ ํฐ ์‚ฌ์ด์ฆˆ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ mutiple shift ๋ฅผ ํ•ด๋„ ๊ดœ์ฐฎ์€ ์ด์œ (Correctness) ๋Š”, Longest ๋กœ ์ฐพ์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋งŒ์•ฝ shift ํ•ด์„œ ๋„˜์–ด๊ฐ„ ์˜์—ญ์— Pattern ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, failureFunction ์—์„œ ๋” Largest Size ๋ฅผ ์ฐพ์•˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

KMP Algorithm ์„ C++ ๋กœ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

#include <iostream>
#include <string>

using namespace std;

int *failureFunction(string P)
{
	/*
    	Pattern Preprocessing Function
		O(2m) time => O(m) time
	*/
	int m = P.length(), i = 1, j = 0; // F[0] ์€ ์ด๋ฏธ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋ฅผ ํ–ˆ๊ธฐ์—, i=1 ๋ถ€ํ„ฐ ์‹œ์ž‘
	int *F = new int[m + 1];

	F[0] = 0; // index 0 ์€ ํ•ญ์ƒ 0์œผ๋กœ ์ดˆ๊ธฐํ™”

	while (i < m) // ๋ฐ˜๋ณต ํšŸ์ˆ˜ 2m ๋ฒˆ์„ ๋„˜๊ธธ ์ˆ˜ ์—†์Œ
	{
		if (P[i] == P[j]) // j+1 ๊ฐœ์˜ ๋ฌธ์ž๊ฐ€ ์ผ์น˜ํ–ˆ๋‹ค!! ๋งŽ์•„์•ผ m ๋ฒˆ ์ˆ˜ํ–‰๋œ๋‹ค.
		{
			F[i] = j + 1; // update
			i++;
			j++; // ๋” Longest ๊ฐ€ ์žˆ๋‚˜ ์ฒดํฌ
		}
		else if (j > 0) // ํ•˜๋‚˜ ์ด์ƒ์ด๋ผ๋„ ๋งž์ท„๋‹ค.. mismatch ๊ฐ€ ๋ฐœ์ƒํ•œ ์ƒํ™ฉ
			j = F[j - 1]; // Use Failure Function to Shift P
		else // j == 0. mismatch ๊ฐ€ ๋ฐœ์ƒํ•œ ์ƒํ™ฉ. ๋งŽ์•„์•ผ m ๋ฒˆ
		{
			F[i] = 0; // No Match
			i++;
		}
	}
	return F;
}

int KMPMatch(string T, string P)
{
	/*
		O(m+n) time. <= O(m) time ์€ failureFunction ์ˆ˜ํ–‰ ์‹œ๊ฐ„
	*/
	int *F = failureFunction(P); // Pattern Preprocessing => O(m) time
	int i = 0; // ํ˜„์žฌ ๋น„๊ตํ•˜๊ณ  ์žˆ๋Š” T์˜ Index. ๋น„๊ต ์‹œ์ž‘ ์ง€์ ์ด ์•„๋‹ˆ๋‹ค.
	int j = 0; // ํ˜„์žฌ ๋น„๊ตํ•˜๊ณ  ์žˆ๋Š” P์˜ Index
	int n = T.length(), m = P.length();

	while (i < n) // O(n) time. 
	{
		// Match
		if (T[i] == P[j]) // ์ง€๊ธˆ ๋ณด๊ณ  ์žˆ๋Š” ๋ฌธ์ž๋ผ๋ฆฌ๋Š” ๋งž๊ตฌ๋งŒ
		{
			if (j == m - 1) // Pattern ๋‹ค ๋งž์•˜๋‹ค.
				return i - j; // i ๋Š” ํ˜„์žฌ T ์— ์กด์žฌํ•˜๋Š” Pattern ์˜ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค. j ๋Š” ํ˜„์žฌ P์˜ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค. ์ด ๋‘˜์„ ๋นผ๋ฉด T ์— ๋“ฑ์žฅํ•˜๋Š” Pattern ์˜ ์ฒซ ์ธ๋ฑ์Šค๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.
			i++; // ๋‹ค์Œ๊บผ๋„ ๋น„๊ตํ•ด๋ณด์ž
			j++; // ๋‹ค์Œ๊บผ๋„ ๋น„๊ตํ•ด๋ณด์ž
		}
		// MisMatch
		else if (j > 0) // ํ•˜๋‚˜๋ผ๋„ ๋งž์•˜๋‹ค..
			j = F[j - 1]; // i ์ฆ๊ฐ€ X
		else
			i++; j=0;
	}
	return -1; // No Match
}

Boyer-Moore Algorithm Variation Version

๋ณด์ด์–ด ๋ฌด์–ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋Š” Heuristic ์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ฐœ๋…์ด ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค. ํœด๋ฆฌ์Šคํ‹ฑ์ด๋ž€, ๊ฒฝํ—˜์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ, ํ•™์Šต, ๋ฐœ๊ฒฌํ•ด๋‚ด๋Š” ๋ฐฉ๋ฒ•์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Global Optimal Solution ์„ ์ฐพ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ด์ง€๋งŒ, ๊ฐ€๋” ์˜ค์ฐจ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค. ๋ณด์ด์–ด ๋ฌด์–ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์—๋Š” 2๊ฐœ์˜ ํœด๋ฆฌ์Šคํ‹ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

1. Looking-glass Heuristic
 Looking-glass ๋ž€ ๊ฑฐ๊พธ๋กœ์˜, ๋ฐ˜๋Œ€์˜ ๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณด์ด์–ด ๋ฌด์–ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ๋Š”, Pattern P๋ฅผ T ์˜ ์ผ๋ถ€๋ถ„์„ ๋น„๊ตํ•  ๋•Œ ๋’ค์—์„œ๋ถ€ํ„ฐ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
2. Character-jump Heuristic 
Text ์˜ index i ์—์„œ Mismatch ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, T[i] = c ๋ผ๊ณ  ๊ฐ€์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
๋งŒ์•ฝ P ์— c ๋ฌธ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด, P ์—์„œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์œ„์น˜ํ•œ c ์™€ T[i] ๋ฅผ Align  ํ•˜๊ณ  ๋‹ค์‹œ P์˜ ๊ฐ€์žฅ ๋’ค์—์„œ๋ถ€ํ„ฐ ๋น„๊ต๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. P ์— c ๋ฌธ์ž๊ฐ€ ์—†๋‹ค๋ฉด, P[0] ๊ณผ T[i+1] ์ด ์ •๋ ฌ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ณด์ด์–ด ๋ฌด์–ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๊ฐ€์žฅ ๋งŽ์ด Shift ํ•˜๋Š” ์ผ€์ด์Šค๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. 

๋Œ€๋žต.. ๋ณด์ด์–ด ๋ฌด์–ด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ”Œ๋กœ์šฐ๋ฅผ ๊ทธ๋ ค๋ณด๋ฉด ์œ„ (๋ฐœ๋กœ ๊ทธ๋ฆฐ)๊ทธ๋ฆผ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค..

 

๋ณด์ด์–ด ๋ฌด์–ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋น„์Šทํ•˜๊ฒŒ, ๋ณธ๊ฒฉ์ ์ธ Pattern Matching ์ „์— Pattern Preprocessing ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ „์ฒ˜๋ฆฌ์—์„œ๋Š” Pattern ์—์„œ ํŠน์ • ๋ฌธ์ž์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์œ„์น˜๋ฅผ ์ฐพ๋Š” ์ž‘์—…์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ด๋ฆ„์€ Last-Occurence Function ์ž…๋‹ˆ๋‹ค. ํŠน์ • ์•ŒํŒŒ๋ฒณ c ์— ๋Œ€ํ•ด์„œ P[i] = c ์ธ ๊ฐ€์žฅ ํฐ i ๊ฐ’์„ ์ €์žฅํ•˜๊ฑฐ๋‚˜, ๋งŒ์•ฝ Pattern ์— c ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋‹ค๋ฉด -1 ์„ ์ €์žฅํ•œ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ํ•˜๋Š” ์ž‘์—…์€ Pattern ์— ํฌํ•จ๋  ์ˆ˜ ์žˆ๋Š” ์•ŒํŒŒ๋ฒณ์˜ ์ˆ˜(s) ๋งŒํผ์˜ ๋ฐฐ์—ด์„ ๋ชจ๋‘ -1๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ O(s) time ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„์— Pattern ์„ ์•ž์—์„œ๋ถ€ํ„ฐ ์Šค์บ”ํ•ด๊ฐ€๋ฉฐ, ๋“ฑ์žฅํ•˜๋Š” ์•ŒํŒŒ๋ฒณ๋“ค์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์œ„์น˜๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” O(m) time ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด Last-Occurence Function ์˜ ์ˆ˜ํ–‰์‹œ๊ฐ„์€ O(m + s) time ์ž…๋‹ˆ๋‹ค. 

๋ณด์ด์–ด ๋ฌด์–ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ C++ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

// Last-Occurence Function ๊ตฌํ˜„ X

#include "bits/stdc++.h"

using namespace std;


int BoyerMooreMatch(string T, string P) {
    int *L = lastOccurenceFunction(P); // O(m+s) time
    int n = T.length();
    int m = P.length();

    int i=m-1, j=m-1;
    do {
        if (T[i] == P[j]) {
            if (j == 0) // Pattern ์˜ ์•ž๊นŒ์ง€ ๋น„๊ต ์™„๋ฃŒ => Match!!
                return i; // T์—์„œ P ๊ฐ€ ๋“ฑ์žฅํ•˜๋Š” ๋งจ ์•ž index ๋ฆฌํ„ด
            else {
                // ์ด์ œ ๊ทธ ์•ž์—๊บผ ๋น„๊ตํ•ด๋ณด์ž!
                i = i-1;
                j = j-1; 
            }
        }
        else {
            // Character Jump
            int l = L[T[i]]; // Mismatch ๊ฐ€ ๋ฐœ์ƒํ•œ Text ์˜ Character ๊ฐ€ Pattern ์—์„œ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ๋“ฑ์žฅํ•˜๋Š” ์œ„์น˜๋ฅผ ๊ฐ€์ ธ์™€!
            i = i + m - min(j, 1 + l); // 
            j = m - 1; // ๋‹ค์‹œ Pattern ์˜ ๋งจ ๋’ค๋ถ€ํ„ฐ ๋น„๊ต๋ฅผ ์‹œ์ž‘
        }
    } while (i >= n-1)

    return -1; // No match
}

 

Analysis

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€

์ด ๊ธ€ ๊ณต์œ ํ•˜๊ธฐ

  • ๊ตฌ๋…ํ•˜๊ธฐ

    ๊ตฌ๋…ํ•˜๊ธฐ

  • ์นด์นด์˜คํ†ก

    ์นด์นด์˜คํ†ก

  • ๋ผ์ธ

    ๋ผ์ธ

  • ํŠธ์œ„ํ„ฐ

    ํŠธ์œ„ํ„ฐ

  • Facebook

    Facebook

  • ์นด์นด์˜ค์Šคํ† ๋ฆฌ

    ์นด์นด์˜ค์Šคํ† ๋ฆฌ

  • ๋ฐด๋“œ

    ๋ฐด๋“œ

  • ๋„ค์ด๋ฒ„ ๋ธ”๋กœ๊ทธ

    ๋„ค์ด๋ฒ„ ๋ธ”๋กœ๊ทธ

  • Pocket

    Pocket

  • Evernote

    Evernote

๋‹ค๋ฅธ ๊ธ€

  • [Algorithms] Dynamic Programming

    [Algorithms] Dynamic Programming

    2023.05.26
  • [C++] ๋ฐฑ์ค€ BOJ 21939 ๋ฌธ์ œ ์ถ”์ฒœ ์‹œ์Šคํ…œ Version 1

    [C++] ๋ฐฑ์ค€ BOJ 21939 ๋ฌธ์ œ ์ถ”์ฒœ ์‹œ์Šคํ…œ Version 1

    2021.11.18
  • [C++] ๊ฑฐ๋ฆฌ๋‘๊ธฐ ํ™•์ธํ•˜๊ธฐ(2021 ์นด์นด์˜ค ์ฑ„์šฉ์—ฐ๊ณ„ํ˜• ์ธํ„ด์‹ญ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ)

    [C++] ๊ฑฐ๋ฆฌ๋‘๊ธฐ ํ™•์ธํ•˜๊ธฐ(2021 ์นด์นด์˜ค ์ฑ„์šฉ์—ฐ๊ณ„ํ˜• ์ธํ„ด์‹ญ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ)

    2021.11.03
  • [Python] ์ˆซ์ž ๋ฌธ์ž์—ด๊ณผ ์˜๋‹จ์–ด(2021 ์นด์นด์˜ค ์ฑ„์šฉ์—ฐ๊ณ„ํ˜• ์ธํ„ด์‹ญ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ)

    [Python] ์ˆซ์ž ๋ฌธ์ž์—ด๊ณผ ์˜๋‹จ์–ด(2021 ์นด์นด์˜ค ์ฑ„์šฉ์—ฐ๊ณ„ํ˜• ์ธํ„ด์‹ญ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ)

    2021.11.03
๋‹ค๋ฅธ ๊ธ€ ๋” ๋‘˜๋Ÿฌ๋ณด๊ธฐ

์ •๋ณด

caputdraconis ๋ธ”๋กœ๊ทธ์˜ ์ฒซ ํŽ˜์ด์ง€๋กœ ์ด๋™

caputdraconis

  • caputdraconis์˜ ์ฒซ ํŽ˜์ด์ง€๋กœ ์ด๋™

๊ฒ€์ƒ‰

๋ฉ”๋‰ด

    ์นดํ…Œ๊ณ ๋ฆฌ

    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (168)
      • Cloud (3)
      • Computer Network (12)
      • Database (2)
      • Terraform (2)
      • ๐Ÿฅš๊ณ ๋ฆฌ์ฆ˜ (13)
      • ๊ฒ…๋ถ€๊ฒ…๋ถ€๐Ÿ™ƒ (10)
        • Naver CS50 ์ฝ”์นญ์Šคํ„ฐ๋”” (2)
        • Machine Learning (1)
        • Computing System (6)
      • ์–ธ์–ด&ํ”„๋ ˆ์ž„์›Œํฌ (20)
        • Python (4)
        • Django (10)
        • Node JS (1)
        • C++ (2)
        • Java (1)
        • Flutter (2)
      • Security (76)
        • WebHacking Study (11)
        • ์ง€์˜ฅ๋ฐฉ ์Šคํ„ฐ๋”” (22)
        • ์—ฌ๋ฆ„๋ฐฉํ•™ ์Šคํ„ฐ๋”” (2)
        • PWN Study (6)
        • SUA Reversing Study (3)
        • PWN (3)
        • WebHacking (20)
        • Reversing (4)
      • ์•Œ๊ณ  ์žˆ์œผ๋ฉด ๋„์›€๋˜์ง€ ์•Š์„๊นŒ,,? (23)
      • ์ผ์ƒ๋‹ค๋ฐ˜์‚ฌ (1)
      • ๊ทผํ™ฉ ์ •๋ฆฌ (1)
      • 42 Seoul (1)
        • Setting (1)

    ์ตœ๊ทผ ๊ธ€

    ์ธ๊ธฐ ๊ธ€

    ๋Œ“๊ธ€

    ๊ณต์ง€์‚ฌํ•ญ

    ์•„์นด์ด๋ธŒ

    ํƒœ๊ทธ

    • ํŒŒ์ด์ฌ
    • ๋“œ๋ฆผํ•ต
    • ํŒŒ์ด์ฌ๊ธฐ์ดˆ
    • old-16
    • ํŒŒ์ด์ฌํ•จ์ˆ˜
    • ๋ฆฌ์ŠคํŠธํ•จ์ˆ˜
    • Python
    • ์›นํ•ดํ‚น.kr

    ๋‚˜์˜ ์™ธ๋ถ€ ๋งํฌ

    • Github
    • solved.ac
    • caputdraconis@kakao.com

    ์ •๋ณด

    caputdraconis์˜ caputdraconis

    caputdraconis

    caputdraconis

    ๋ธ”๋กœ๊ทธ ๊ตฌ๋…ํ•˜๊ธฐ

    • ๊ตฌ๋…ํ•˜๊ธฐ
    • RSS ํ”ผ๋“œ

    ๋ฐฉ๋ฌธ์ž

    • ์ „์ฒด ๋ฐฉ๋ฌธ์ž
    • ์˜ค๋Š˜
    • ์–ด์ œ

    ํ‹ฐ์Šคํ† ๋ฆฌ

    • ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ
    • ์ด ๋ธ”๋กœ๊ทธ ๊ด€๋ฆฌํ•˜๊ธฐ
    • ๊ธ€์“ฐ๊ธฐ
    Powered by Tistory / Kakao. Copyright © caputdraconis.

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”