record logo record

라빈 카프(Rabin-Karp) 알고리즘 이란?

라빈 카프(Rabin-Karp) 알고리즘의 특징

라빈 카프(Rabin-Karp) 알고리즘 예시

Step 1에서 2로 한칸 이동하면서 가장 바로 앞의 ‘a’만큼의 수치를 빼 준 뒤에 2를 곱하고 새롭게 뒤에 들어온 ‘a’의 수치를 더해준다.

따라서, parent 해시 값 = 2 * ( parent 해시 값 - 가장 앞에 있는 문자의 수치) + 새롭게 들어온 문자의 수치

Source Code

#include <iostream>

using namespace std; 

void findString(string parent, string pattern) {
	int parentSize = parent.size();
	int patternSize = pattern.size();
	int parentHash = 0, patternHash = 0, power = 1; // power: 제곱수 
	for(int i = 0; i <= parentSize - patternSize; i++) {
		if(i == 0) {
			for(int j = 0; j < patternSize; j++) {
				parentHash += parent[patternSize - 1 - j] * power;
				patternHash += pattern[patternSize - 1 - j] * power;
				if(j < patternSize - 1) power *= 2;
			}
		} else {
			parentHash = 2 * (parentHash - parent[i - 1] * power) + parent[patternSize - 1 + i];
			
		}
		if(parentHash == patternHash) {
			bool finded = true;
			for(int j = 0; j < patternSize; j++) {
				if(parent[i + j] != pattern[j]) {
					finded = false;
					break;
				}
			}
			if(finded) {
				printf("%d번째에서 발견했습니다. \n", i + 1);
			}
		}
	}
	
}

int main(void) {
	string parent = "ababacabacaabacaaba";
	string pattern = "abacaaba";
	findString(parent, pattern);
	return 0;
}

References