사례 무감각 삼가 검색 트리
-
03-07-2019 - |
문제
나는 사용하고 있었다 3 배 검색 트리 잠시 동안, 자동 완료 드롭 다운 콤보 상자를 구현하는 데이터 구조로서. 즉, 사용자 유형 "fo"인 경우 드롭 다운 콤보 상자가 표시됩니다.
푸 푸드 풋볼
문제는, 현재 3 원 검색 트리에 사용 된 나의 현재 사용은 대소 문자를 민감하다는 것입니다. 내 구현은 다음과 같습니다. 그것은 실제 세계에서 약 1 ++ yeas에 사용되었습니다. 따라서 나는 그것을 매우 신뢰할 수 있다고 생각합니다.
그러나, 나는 "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를 핵심 백본으로 사용하고 있습니다.
// 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 값으로 맵핑하거나 접두사를 얻는 동안 값을 확인하십시오.