본문으로 바로가기

Rabin-Karp Fingerprinting 이란?

category Algorithm/String 2017. 1. 5. 18:39

Rabin-Karp Fingerprinting이란?

긴 String을 Hashing해서 사용할 때 쓰는 알고리즘이다.


k길이의 스트링 str[i, i+k-1]을 들여다 보면 k만큼의 시간이 걸린다.

그리고 나서 i+1부터 다시 k길이의 스트링을 들여다 보면 또 k만큼의 시간이 걸린다.


그럼 어떻게 할까?

hash를 재미있게 이용하면 된다.


hashing하는 function을 f()라고 하면


그니까 hashmap을 만들때 처음 k길이의 스트링에 대한 hash값을 만든다면 인덱스를 하나 옮긴 스트링의 hash를 에 구할 수 있다.


여기서 x값은 스트링 s에 들어오는 문자의 종류에 따라 설정하면 된다. 영어의 대소문자만 쓴다면 26+26 = 52개로 지정할 수도 있고, 아스키코드에 해당하는 문자열이 다 들어오는 경우  256으로 설정하면 되겠다. (문자 종류보다 적은 수로 x를 설정하면 확실히 collision이 미친듯이 일어나겠지...)

값은 엄청 커질수가 있으므로 mod 연산을 사용할 수 밖에 없다. 혹시라도 마이너스 연산에서 모드 할 때에는 MOD값을 더해주고 %MOD하는 것을 잊지말자~!

또 MOD값을 설정할 때는 당연히 큰 소수로... :D


끝.