문제

나는 사용하고 있었다 3 배 검색 트리 잠시 동안, 자동 완료 드롭 다운 콤보 상자를 구현하는 데이터 구조로서. 즉, 사용자 유형 "fo"인 경우 드롭 다운 콤보 상자가 표시됩니다.

푸 푸드 풋볼

문제는, 현재 3 원 검색 트리에 사용 된 나의 현재 사용은 대소 문자를 민감하다는 것입니다. 내 구현은 다음과 같습니다. 그것은 실제 세계에서 약 1 ++ yeas에 사용되었습니다. 따라서 나는 그것을 매우 신뢰할 수 있다고 생각합니다.

제 3 원 검색 트리 코드

그러나, 나는 "fo"를 입력 할 때 드롭 다운 콤보 상자가 나를 보여줄 경우의 둔감 한 3 가지 검색 트리를 찾고 있습니다.

푸 푸드 풋볼

TST의 주요 인터페이스는 다음과 같습니다. 여기서 새로운 Case Insentive TST에도 비슷한 인터페이스가 있기를 바랍니다.

    /** 
 * Stores value in the TernarySearchTree. The value may be retrieved using key.
 * @param key A string that indexes the object to be stored.
 * @param value The object to be stored in the tree.
 */    
public void put(String key, E value) {
    getOrCreateNode(key).data = value;
}

/**
 * Retrieve the object indexed by key.
 * @param key A String index.
 * @return Object The object retrieved from the TernarySearchTree.
 */
public E get(String key) {
    TSTNode<E> node = getNode(key);
    if(node==null) return null;
    return node.data;
}

사용의 예는 다음과 같습니다. TSTSearchEngine은 TernarySearchTree를 핵심 백본으로 사용하고 있습니다.

3 원 검색 트리의 예제

// There is stock named microsoft and MICROChip inside stocks ArrayList.
TSTSearchEngine<Stock> engine = TSTSearchEngine<Stock>(stocks);
// I wish it would return microsoft and MICROCHIP. Currently, it just return microsoft.
List<Stock> results = engine.searchAll("micro"); 
도움이 되었습니까?

해결책

내 현재 3 원 검색 트리를 Case Insensitive 검색을 지원하기가 어렵게 만드는 핵심 요소 중 하나는 내 기본 데이터 구조가 일대일 매핑이라는 것입니다. 다음 테스트 코드를 참조하십시오.

public void testPut() {
    System.out.println("put");
    Name name0 = new Name("abc");
    Name name1 = new Name("abc");
    TernarySearchTree<Name> instance = new TernarySearchTree<Name>();
    instance.put(name0.toString(), name0);
    instance.put(name1.toString(), name1);
    assertEquals(2, instance.matchPrefix("a").size()); // fail here. Result is 1
}

내 현재 단기 솔루션은 TSTSearchEngine을 사용하여 전체 TernarySearchTree를 마무리하고 있다는 것입니다. TSTSearchEngine은 구성되어 있습니다

(1) TernarySearchTree, 맵핑 할 상단 키를 제공합니다.

(2) String-to-arraylist 맵.

내가 수행 할 때 발생하는 일은 다음과 같습니다.

TSTSearchEngine<Name> engine = TSTSearchEngine<Name>();
engine.put(name0); // name0 is new Name("Abc");
engine.put(name1); // name0 is new Name("aBc");

(1) name0.toString ()은 상단 사례 ( "ABC")로 변환됩니다. TernarySearchTree에 삽입됩니다. "ABC"는 TernarySearchTree의 핵심과 가치가 될 것입니다.

(2) "ABC"는 MAP의 키로 사용하여 이름 0을 배열 목록에 삽입합니다.

(3) name1.toString ()은 상단 사례 ( "ABC")로 변환됩니다. TernarySearchTree에 삽입됩니다. S1은 TernarySearchTree의 핵심 및 가치가 될 것입니다.

(4) "ABC"는 MAP의 키로 사용하여 이름 1을 배열 목록에 삽입합니다.

내가 시도 할 때

engine.searchAll("a");

(1) TernarySearchtree는 "ABC"를 반환합니다.

(2) "ABC"는 맵에 액세스하는 키로 사용됩니다. MAP은 Name0 및 Name1을 포함하는 배열 목록을 반환합니다.

이 솔루션은 작동합니다. 샘플 코드를 참조 할 수 있습니다 새로운 TSTSearchEngine의 샘플 코드

그러나 이것은 두 번의 검색 패스가 필요하기 때문에 효과적인 솔루션이 아닐 수 있습니다. C ++에 구현이 있음을 알게됩니다. C ++ 사례 무감각 제 3의 검색 트리 구현. 따라서 C ++ 코드를 Java로 포팅 할 수있는 기회가 있습니다.

다른 팁

나는 이전에 TST를 사용하지 않았지만, 저장소와 조회 중에 키를 낮추거나 어퍼 스케이션하는 것만 큼 간단하지 않습니까? 코드 스 니펫에서 작동하는 것처럼 보입니다.

3 배 검색 트리를 구현했습니다. http://kunalekawde.blogspot.com/2010/05/radix-patricia-and-ternary.html사례의 무감각 한 바에 따르면, 작은 매핑과 캡을 하나의 16 진수/DEC 값으로 맵핑하거나 접두사를 얻는 동안 값을 확인하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top