2010-07-16 6 views
2

많은 양의 데이터와 문자열 일치를 수행하고 있습니다.Java에서 문자열 검색 알고리즘

편집 : 큰 목록에 포함 된 단어를 일부 온톨로지 텍스트 파일과 일치시킵니다. 온톨로지에서 각 파일을 가져 와서 각 파일 행의 세 번째 String과 목록의 단어를 검색합니다.

필자가해야 할 일은 순수한 일치 (결과가 좋지 않음)가 아니라, 문자열이 다른 문자열 안에 포함될 때 결과를 반환하는 좀 더 느슨한 일치 함수가 필요하다는 사실을 과오 감독 한 것입니다.

나는 이것을 Radix Trie; 그것은 매우 빠르며 훌륭하게 작동하지만, 이제는 trie가 정확한 일치만을 반환하기 때문에 내 작업이 쓸모 없다고 생각합니다. :/

  • 이 작업을 수행하는 알고리즘 유형은 문자열 검색 알고리즘입니까?
  • 누군가가 경험이있는 Java 구현을 제안 할 수 있습니까?

알고리즘은 빠르지 만 최우선 순위가 아니기 때문에 속도는 & 복잡합니다.

모든 조언/예/설명/링크에 대해 매우 감사드립니다.

감사합니다.

+0

"이 작업을 수행하는 알고리즘 유형은 문자열 검색 알고리즘입니까?" 질문? – Svante

답변

3

Suffix Trees이 유용 할 수 있습니다 (개념은 Tries와 유사 함).

각 문자열 앞에 ^가 붙고 $로 끝나고 추가 된 모든 문자열의 접미어 트리를 만듭니다. 공간 사용량은 O (n)이고 아마도 trie에 대한 것보다 더 나쁠 것입니다.

문자열 s를 검색해야하는 경우 trie처럼 쉽게 O (| s |) 시간을 할 수 있으며 일치하는 문자열은 부분 문자열 일치입니다 (기본적으로 일부는 일부 문자열의 접미사).

죄송합니다. 유용한 Java 구현에 대한 참조가 없습니다.

발견 유용한 유래 답변 : Generalized Suffix Tree Java Implementation

있습니다 http://illya-keeplearning.blogspot.com/2009/04/suffix-trees-java-ukkonens-algorithm.html

차례가 어떤 : 소스 코드 : http://illya.yolasite.com/resources/suffix-tree.zip

+0

@ 모론 : 이것이 정확히 내가 필요한 것이라고 생각합니다. 만약 내가 잘 이해하면, 같은 나무로 "일치"와 "포함"을 할 수 있습니다 ???? – Julia

+0

@ Julia : 맞습니다. 정확히 일치 시키려면 검색 문자열 앞에 ^를 붙이고 $를 추가하고 일치 항목을 찾으십시오. contains가 포함 된 경우 검색 문자열을있는 그대로 사용하십시오. –

+0

@ 모론 : 이것이 완벽 할 것 같습니다. 자바 라이브러리가 있어야합니다 !! – Julia

1

정규 표현식은 확실히 당신의 최선의 방법입니다 작업을 할 것 같은데. 쓸데없는 것일 수도 있지만 이해하기 어려운 일련의 if/else 또는 switch 문을 사용하지 않고 느슨한 일치를 얻을 수있는 유일한 방법입니다.

더하기, 대안보다 훨씬 빠릅니다.

+0

나는 나의 설명을 수정했다, 나는 명확히 유감스럽게 설명하지 않았다! – Julia

+0

-1 : 왜 정규 표현식이 '최상'입니까? 왜/else 명령문을 전환하는 이유는 무엇입니까? 다른 대안을 선택하기 전에 어떤 대안을 고려 했습니까? 나는 정규 표현식의 퍼포먼스가 아주 나쁜 것이라고 말할 것이다. 당신은 그것들을 컴파일해야하고 일치하는 동안 가능한 backtracking을해야합니다 ... –

+0

글쎄, 질문은 원래 구두 (사전 편집)였습니다. 그것은 그것을 읽는 방법입니다 - 분명히 더 이상 적용되지 않습니다! – chimeracoder

1

당신이 하나의 패턴 텍스트 파일에서 검색 BM algorithm을 사용할 수 있습니다 , 그리고 귀하의 목록에있는 모든 패턴에 대해이 알고리즘을 반복하십시오. 당신이 자바에서 같이 IndexOf 메서드를 사용하지 않는 이유는 Aho–Corasick string matching algorithm

+0

http://johannburkard.de/software/stringsearch/? 당신은 텍스트 파일에서 검색을 말하지만, 텍스트 파일의 어느 곳에서나 일치 할 필요는 없지만 각 줄의 모든 세 번째 문자열은 지정할 수 있습니까? (자세한 내용은 죄송합니다. 나는 radix trie로 한 것처럼 서둘러야합니다.) – Julia

+0

BM 알고리즘은 문자열의 원본 (파일의 텍스트, 데이터베이스의 셀 ... 등)에 관계없이 모든 문자열과 일치합니다. –

0

:

다른 가장 좋은 방법은 같은 멀티 패턴 검색 알고리즘을 사용하는 것입니다. 메모리 가용성에 따라 콘텐츠를 읽으십시오. indexOf를 수행하고 필요한 모든 행을 가져옵니다. 다음 내용 세트를로드하십시오.

파일에서 읽는다면 스트림을 사용하십시오.

아이디어가 좋지 않을 수도 있지만, 나는 자바에서 믿습니다. 그것은 최고의 알고리즘을 사용합니다.

정규 표현식을 사용하면 더 좋습니다.