당신이 요구하는 것은 당신의 제약이 주어지면 가능합니다.
분석
해시 테이블의 장점은 빠른 조회 및 삽입 속도입니다. 그 속도를 얻으려면 테이블에서 순서의 유사성을 잊어 버려야합니다. 즉, 항목이 모두 뒤죽박죽입니다. 순회가 O (n) 인 동안 해시 테이블이 충분히 크고 테이블에 저장된 오브젝트가 우수한 품질의 해싱 알고리즘을 사용하여 해시되는 것으로 가정하므로 목록은 테이블 항목으로 사용할 수 있습니다.
이진 검색 트리 (BST)는 O (log 2 n) 에서 빠른 삽입 및 조회 기능을 제공 합니다. 또한 저장하는 요소에 제한을가합니다. 요소를 주문하는 방법이 있어야합니다. 트리에 저장된 두 개의 요소 A 와 B가 주어지면 A 가 B 보다 앞에 오는지 또는 동등한 순서 를 갖는지 확인할 수 있어야합니다 .
해시 테이블에는 이러한 제한이 없습니다. 해시 테이블의 요소에는 두 가지 속성이 있어야합니다. 첫째, 그것들이 동등한지를 결정하는 방법이 있어야합니다. 둘째, 결정적 해시 코드를 계산하는 방법이 있어야합니다. 주문은 필수 요건이 아닙니다.
해시 테이블 요소에 순서가있는 경우 BST를 해시 테이블 항목으로 사용하여 동일한 해시 코드 (충돌)를 가진 오브젝트를 보유 할 수 있습니다. 그러나 O (log 2 n) 조회 및 삽입 이있는 BST로 인해 전체 구조 (해시 테이블 + BST)에 대한 최악의 경우가 목록을 테이블 항목으로 사용하는 것보다 기술적으로 우수합니다. BST 구현에 따라 목록보다 많은 스토리지가 필요하지만 그다지 많지는 않습니다.
일반적으로 BST의 오버 헤드와 동작은 실제 상황 에서 해시 테이블 버킷으로 테이블 에 아무 것도 가져 오지 않으므로 목록의 이론적 인 성능 저하가 허용됩니다. 즉, 해시 테이블은 각 목록 (버킷)에 더 적은 수의 항목을 배치하여 목록의 약점을 보상합니다. 그러나 문제는 해시 테이블의 크기를 늘릴 수 없으며 해시 테이블 에서 일반적인 것보다 충돌이 더 자주 발생한다는 점입니다.
이행
솔직히 필요하지 않으며 어쨌든 언어를주지 않았기 때문에 여기에 코드를 넣지 않을 것입니다.
내가 할 일은 단순히 언어의 표준 라이브러리에 포함 된 표준 해시 테이블을 새 클래스로 복사 한 다음 테이블 버킷 유형을 목록에서 트리로 변경하는 것입니다. 언어와 표준 라이브러리에 따라이 작업은 매우 간단 할 수 있습니다.
일반적으로 나는 이와 같은 복사 및 붙여 넣기 코딩을 옹호하지 않을 것입니다. 그러나 전투 테스트를 거친 데이터 구조를 매우 빠르게 얻는 쉬운 방법 입니다.