CS/알고리즘
ShiftOr 알고리즘
lms0806
2024. 7. 28. 14:54
728x90
반응형
이번 시간에는 ShiftOr이라는 근사 문자열 매칭 알고리즘에 대하여 이야기해보고자 합니다.
unix 계열의 agreap이라는 명령어에서 사용하고 있습니다.
https://en.wikipedia.org/wiki/Agrep
대상이 되는 문자열에 패턴의 길이만큼 비트값으로 저장한 후, 이를 비트연산을 통하여 계산하면서 찾고자 하는 문자열의 위치를 찾는 알고리즘입니다.
public static int shiftOr(String text, String pattern) {
long patternMask[] = new long[65536];
Arrays.fill(patternMask, ~0L);
long lim = 0, j = 1;
for(int i = 0; i < pattern.length(); i++, j <<= 1){
patternMask[pattern.charAt(i)] &= ~j;
lim |= j;
}
lim = ~(lim >> 1);
long state = ~0;
for (int i = 0; i < text.length(); i++) {
state = (state << 1) | patternMask[text.charAt(i)];
if (state < lim) {
return i + 1;
}
}
return -1;
}
해당 알고리즘은 이해하기 쉽고, 구현하기 비교적 간단하다는 장점을 가지고 있지만, 단순 매칭알고리즘의 형태로 사용하기에는 속도적인 측면에서 기본 JAVA알고리즘들에 비하여 많이 느리다는 단점을 가지고 있습니다.
대상 / pattern / 반복 횟수 | ShiftOr | (java) indexOf | (java) contains |
"abcdef" / "ab" / 100,000 | 3.328(s) | 0.003(s) | 0.007(s) |
보시다시피, 매칭 알고리즘 용도로는 기본 내장 라이브러리 함수보다 많이 느린 것을 확인할 수 있습니다.
해당 블로그를 참고하였습니다.
728x90
반응형