2011-04-09 4 views
4

KMP (Knuth-Morris-Pratt) 알고리즘과 BM (Boyers-Moore) 알고리즘은 모두 좋은 문자열 검색 연산 알고리즘입니다. BM이 KMP보다 3-5 배 빠름을 압니다.KMP 또는 BM 알고리즘을 사용해 본 적이 있습니까?

업계 소프트웨어 프로그래밍 경험에서 BM 또는 KMP 알고리즘을 사용해 본 적이 있습니까? 알고리즘이 실제로 여기서 중요합니까?

+0

나는 KMP가 BM의 약자이지만 BM이 아닌 것을 안다. 다른 사람들이 모를 경우에 대비하여 각자의 뜻을 적어 두는 것이 좋을까요? – Mehrdad

+2

@Mehrdad : BM은 아마도 Boyer-Moore입니다. –

+0

@Mike : 아, 고마워! – Mehrdad

답변

6

예를 들어 Java의 String.indexOf 함수를 살펴보면 문자열 일치에 무차별 방식을 사용하는 것으로 보입니다. 그 이유는 궁금 할 것입니다.

이유는 일부 쿼리 사전 처리가 이러한 알고리즘에서 수행되며 이는 값이 비쌀 수 있습니다 (특히 두 배열을 모두 사용하는 경우 BM의 경우). 따라서 KMP와 BM이 무차별 방식을 사용하기 전에 검색하는 문자열은 큰 크기 여야합니다.

다른 알고리즘을 사용할 때 항상 거래가 발생하며 큰 문자열을 처리 할 때 쿼리 대신 텍스트의 색인 생성 (예 : 접미어 트리)을 고려할 수 있습니다. 매번 새로운 텍스트를 다룰 때 유용합니다.

제 생각에는 이러한 알고리즘은 다소 학문적이며 특별한 상황에서만 유용합니다.

+0

좋은 답변 – user699656

+2

흥미롭게도 gcc'strstr()'구현 ('String.indexOf()'와 동일)은 BM 및 KMP와는 달리 선형 시간 만 필요로하는 매우 멋진 알고리즘을 사용합니다. 그것은 라이브러리 함수에서 순진한 O (n^2) 메소드를 사용하는 이유를 근본적으로 제거합니다. 두 알고리즘이 이미 매우 (즉, 충분히) 빠르면 매우 짧은 문자열에서만 빠른 경우가 있기 때문입니다. (MAK의 답변에서 얻었습니다.) –

+1

사실 String의 * real * indexOf 메소드는 대개 JDK 소스에서 볼 수있는 것이 아니라 JDK에 의해 삽입 된 내장 버전입니다. Sun의 핫스팟에는 Java 6 및 7. 사실 버전은 BM의 단순화 된 변형을 사용합니다.검사 된 문자가 문자열에 전혀없는 경우에만 작동합니다. 대개의 경우 (참고 참조) N 개의 문자를 건너 뜁니다. 여기서 N은 검색 문자열의 길이입니다. 참고 : 알고리즘은 32 개 항목의 해시 테이블을 사용하여 문자열에 문자가 나타나는지 확인하기 때문에 *가 * 입력됩니다. 충돌이 발생할 수 있습니다. – BeeOnRope

2

하드웨어에서 KMP를 한 번 구현했습니다. 하드웨어가 FPGA 인 경우 재구성 기능을 사용하여 자체 수정 회로를 사용할 수 있습니다. 이 회로는 검색 문자열을 얻습니다. 필요한 것보다 하드웨어에서 미리 컴파일하고 KMP를 만들 로직을 재구성해야합니다. 그러나 속도를 높이기 위해 많은 양의 데이터를 크롤링해야하지만 여기서도 DNA 일치 (예 : DNA 일치)가 있습니다.

+0

감사합니다. flolo, 좋은 경험 공유. :) – user699656

3

glibc의 strstr 기능은 선형입니다. Boyer-Moore의 변종이라고 생각되는 Two-Way Algorithm을 사용합니다. 그래서, gcc에서 strstr을 사용하는 사람은 실제로 실제 문자열 검색 알고리즘을 사용하고 있습니다.

빠른 알고리즘이 중요한지 여부에 대한 질문은 IMHO는 데이터 크기가 충분히 큰 경우에만 중요합니다. 우리가하는 많은 명시 적 문자열 연산은 매우 작은 문자열 (500 자 미만)에 있습니다. 이는 문자열 작업 (예 : 데이터베이스의 전체 텍스트 검색)을 수행하지 않는다는 것을 의미하지는 않습니다. 그러나이 경우 우리는 일반적으로 데이터베이스 나 라이브러리가 우리를 위해 무거운 짐을 지도록 만듭니다. 데이터베이스 또는 라이브러리는 빠른 문자열 검색 알고리즘을 사용하므로 중요하지 않다고 말하면서 사용법이 우리에게 직접 표시되지 않습니다.

+0

와우! 선형 시간 및 일정 공간, 모든 상자를 틱! 왜 내가이 알고리즘에 대해 들어 보지 못한지 궁금하다. http://www-igm.univ-mlv.fr/~lecroq/string/node26.html#SECTION00260에서 설명을 따르지 않아서 Crochemore & Perrin의 1991 년 논문을 다운로드했지만 25 개의 불길 함을 발견했습니다. 페이지 - 내 "캐주얼 읽기"임계 값 이상. :/하루 ... –

+0

@j_random_hacker : 너무 힘들어서 나를 따라 오지 마라. 나는 KMP 나 Rabin Karp만큼이나 인기가 없다고 생각합니다. – MAK

관련 문제