2012-06-06 3 views
3

질문이 있습니다. 30000 개의 이름이 포함 된 비즈니스 주소록을 구현해야합니다. 모든 이름에는 성과 이름이 있습니다. 성을 입력 할뿐만 아니라 성을 검색하는 자동 완성 텍스트 상자를 구현해야합니다. Google에서 검색 patricia trie를 사용하여이 문제를 해결했음을 알았지 만 접두사 검색 만하므로 firstname + 성으로 trie를 만들면 firstname과 lastname을 어떻게 검색 할 수 있습니까?주소록 및 트리 구조

이렇게 두 문자열을 삽입하여 항목을 복제해야합니까? 성 및 이름 및 성 + 이름

도와주세요!

매우 효율적이어야합니다.

감사합니다.

답변

0

예, 가장 간단한 해결책은 두 변종을 모두 삽입하는 것입니다. 그러나이 항목은 항목이 아닌 검색 문자열 만 복제해야합니다. 어쩌면 이름과 성의 구분을 정규화하고 싶을 것입니다 (= 주소록과 사용자 입력에 대한 구두점 문자 제거). 따라서 모든 경우에 "John Doe", "Doe , John ","Doe John "등.

부분 트라이가 아니라 균형 잡힌 트리를 사용합니다. 많은 언어에서, 균형 잡힌 트리가 라이브러리의 정렬 된 맵 구현 (Java 및 C++ 이상)으로 사용됩니다.

+0

답변 해 주셔서 감사합니다. 그러나 문자열을 검색 할 때 동일한 사람을 나타내는 두 개의 레코드를 얻는 것이 가능합니다! 예를 들면 marco marchi. 그래서 내가 마르크를 찾으면 나는 마르코 마르치와 마르크 마르코의 두 기록을 얻습니다. 그래서 뭐 할까? – Mapo

+0

균형 잡힌 나무가 어떻게 부분 일치를 줄 수 있습니까? 또한 균형 잡힌 나무는 덜 효율적입니다. 즉, 현존하는 문자열을 찾아내는 것입니다. – amit

+0

주소 나 생년월일의 일부를 키에 추가 할 수도 있습니다. 사용자가 올바른 항목을 선택하는 데 도움이되는 것이 이상적입니다. 고유 키가 있는지 확인하고 값 목록을 필요로하지 않으려면 고유 한 레코드 ID를 추가하십시오. 사용자로부터 ID를 숨길 수 있습니다. –

2

또 다른 가능성은 두 번의 시도를 만드는 것입니다.

첫 번째 이름은 T1이되고, 마지막 이름은 두 번째 이름입니다 (T2).

당신이 (보통 $ 기호로 표시) T1 각 단어 터미네이터에서의 트라이를 구성

T2의 관련 항목에 대한 포인터의 목록을 추가하고, 그 반대.

I.E.

T1: 
    J 
    | 
    O 
    | 
    H 
    | 
    N 
    | 
    $1 
T2: 
    D 
    | 
    O 
    | 
    E 
    | 
    $2 

$ 1 $ 1 포함, 목록을 개최한다 $ 2 $ 2로 포인터를 포함하는 목록을 개최한다 : 존 도우는 입장 인 경우.

각 접두사 검색은 자동 완성을 얻은 다음 포인터를 사용하여 전체 이름을 가져옵니다 (부분 검색은 성/이름 만 입력하면 포인터를 사용하여 두 번째 정보를 얻음). 이름을 검색

이 모두 시도에서 검색하면됩니다, 당신은 포인터의 일치 여부를 확인해야합니다 (T1T2의 마지막 이름의 이름을 찾아, 각각 관련 $1$2를 얻을 수) (목록 l1 in $1$2이고 목록 l2$2$1을 포함합니다. 그들이하는 경우 - 이름은 사전에 있습니다.

$ 노드에 대한 포인터가 있으면 루트가되어 $ 기호가 나타내는 단어를 얻을 때까지 간단히 트라이로 돌아갈 수 있습니다.(각 노드의 상위 노드에 대한 포인터가 필요함)

참고 : 간단한 시도에 대해 설명했지만, patricia를 사용하지 않는 이유는 없습니다. 동일한 접근 방식을 사용합니다.

+0

답장을 보내 주셔서 감사합니다. 나는 그것을 연구해야한다. 하나의 질문. 두 가지 시도에서 검색하는 것이 효율적입니까? 어때? 이 구조가 서버 측에서 구현되어야한다고 생각하십시오! 감사합니다 – Mapo

+0

@ user788779 : 두 번의 시도에서 검색하는 것이 덜 효율적이어서이 경우 하나만 검색하면 병렬 처리 될 수 있기 때문에 더 좋을 수도 있습니다 - 거대한 문자열에 도움이 될 수 있습니다 (드물 긴하지만). 이 접근법에서 속도가 느린 점은'$ 1'과'$ 2'를 발견하면 포인터 목록과 일치하는 것입니다. – amit

+0

확인. 와일드 카드 검색을 위해 permuterm 인덱스를 사용하는 것이 가능한 해결책을 읽었습니다. 당신에 따르면이 해결책이 나를 도울 수 있습니까? – Mapo