2008-11-06 12 views
2

누군가가 soundex algorithm 프로그램에 사용할 데이터 구조를 제안 할 수 있습니까? 사용할 언어는 Java입니다. 자바에서 이전에 작업 한 사람이 있다면. 이러한 기능을 가지고 있어야이 프로그램은 : 단지 몇 가지 조언 어떤 데이터에 나는 프로그램 구현을 원하지 않는 같은 사운 덱스soundex 알고리즘의 데이터 구조?

을 갖는 관련 단어를 이 단어를 읽을 수 있어야 약 50,000 단어를 읽고 돌아갈 수 사용할 구조.

답변

1

원본 문자열을 soundex 키로 변환하여 해시 테이블로 변환해야한다고 생각합니다. 테이블의 각 항목에 대한 값은 해당 soundex에 매핑되는 원래 문자열의 모음이됩니다.

의 MultiMap 컬렉션 인터페이스 (및 그 구현)가 유용 할 것입니다.

3

힌트 : SQL을 databackend로 사용하는 경우 SQL에서 두 sql-function SOUNDEX 및 DIFFERENCE로 처리하도록 할 수 있습니다.

아마도 원하는 것은 아니지만 많은 사람들은 MSSQL에이 두 가지 기능이 있다는 것을 모릅니다.

2

잘 soundex는 문자열을 직접 전달할 수 있으므로 특별한 사항은 필요하지 않습니다.

그런 다음 4 문자 코드를 정수 키로 처리 할 수 ​​있습니다.

그런 다음 정수 키로 색인 된 단어 집합을 저장하는 사전을 작성하십시오. 50,000 단어가 메모리에 쉽게 들어가야하므로 아무 것도 필요하지 않습니다.

다음 사전을 걷고 각 버킷은 비슷한 소리가 나는 단어 그룹입니다. 사운 덱스는 해시이기 때문에

#!/usr/bin/perl 
use Text::Soundex; 
use Data::Dumper; 
open(DICT,"</usr/share/dict/linux.words"); 
my %dictionary =(); 
while (<DICT>) { 
     chomp(); 
     chomp(); 
     push @{$dictionary{soundex($_)}},$_; 
} 
close(DICT); 
while (<>) { 
     my @words = split/+/; 
     foreach (@words) { 
      print Dumper $dictionary{soundex($_)}; 
     } 
} 
+0

왜 이중형입니까? (DOS 파일에서 CR과 LF를 모두 제거 할 수 있습니까?) –

+0

DOS가 없으면 그렇지 않은 경우가 있습니다. –

+0

글쎄, 글을 쓰고 난 후에 그 질문이 자바라는 태그임을 깨달았다. 하지만 나는이 정보를 유익하다고 생각하기 때문에 여기에 남겨두고 있습니다. –

0

, 내가 키와 사운 덱스와 해시 테이블을 사용하십시오 :

사실, 여기에 펄에서 전체 프로그램입니다.

+0

정확한 답변을 해주는 워렌에게 감사 드려요. 연결된 목록? 이진 검색 트리? 배열? 또는 다른 것? 해시 테이블 대신 해시 맵은 어떻습니까? – javac

+0

해시 테이블 *은 데이터 구조입니다 ... 아니면 최소한 나는 그것이 정말로 확실하다고 생각했습니다 :) .. 50000 단어로 생각하면 어떤 구조를 선택 하느냐가 너무 중요하지 않을 것입니다. 당신이 5000000을 말하고 있다면, 그것은 분명히있을 수 있습니다. – warren

1
class SpellChecker 
{ 

    interface Hash { 
    String hash(String); 
    } 

    private final Hash hash; 

    private final Map<String, Set<String>> collisions; 

    SpellChecker(Hash hash) { 
    this.hash = hash; 
    collisions = new TreeSet<String, Set<String>>(); 
    } 

    boolean addWord(String word) { 
    String key = hash.hash(word); 
    Set<String> similar = collisions.get(key); 
    if (similar == null) 
     collisions.put(key, similar = new TreeSet<String>()); 
    return similar.add(word); 
    } 

    Set<String> similar(String word) { 
    Set<String> similar = collisions.get(hash.hash(word)); 
    if (similar == null) 
     return Collections.emptySet(); 
    else 
     return Collections.unmodifiableSet(similar); 
    } 

} 

해시 전략은 Soundex, Metaphone 일 수 있습니다. 일부 전략을 조정할 수 있습니다 (얼마나 많은 문자를 출력합니까?)

0

4 바이트 정수가 필요합니다.

soundex 알고리즘은 항상 4 문자 코드를 반환합니다. ANSI 입력을 사용하면 4 바이트 문자가 반환됩니다 (4 문자로 표시).

이렇게 해시 테이블에 반환 된 코드를 저장하고 코드로 단어를 변환하여 해시 테이블에서 찾으십시오. 정말 쉽습니다.