이 주제에 대한 전체 논문이 작성 될 수 있습니다. 몇 가지 중요한 사항을 다루고 다른 데이터 구조에 대한 논의를 최소한으로 유지합니다 (실제로 많은 변형이 있음). 이 답변에서 은 사전의 키 수입니다.엔
짧은 대답은 대부분의 경우 해시 테이블이 더 빠르지 만 최악의 경우 매우 나쁠 수 있다는 것입니다. 검색 트리는 최악의 상황 을 길들이 는 등 많은 장점이 있지만 일반적인 경우에는 다소 느립니다.
O ( 리터 g ( N ) )L O g2( n )
2 NO ( 1 )
해시 테이블의 일반적인 문제는 복잡성이 보장되지 않는다는 것입니다.O ( 1 )
- 또한, 테이블이 가득 차는 지점이 있습니다. 이런 일이 발생하면 (또는 그보다 약간 전에) 테이블을 확장해야하며, 비용 으로 모든 요소를 이동해야합니다 . 이는 많은 요소가 추가 될 때 "저렴한"동작을 유발할 수 있습니다.O ( n )
- 입력이 몇 가지 해시 값에 대해 충돌 할 수 있습니다. 이것은 자연스럽게 거의 발생하지 않지만, 침입자가 입력을 선택하면 보안 문제가 될 수 있습니다. 이는 일부 서버의 속도를 상당히 저하시키는 방법입니다. 이 문제로 인해 일부 프로그래밍 언어 구현 (예 : Perl 및 Python)이 일반 오래된 해시 테이블에서 해시 테이블이 빌드 될 때 선택된 임의의 숫자를 포함하는 해시 함수로 전환되었으며이 임의의 데이텀을 잘 분산시키는 해시 함수와 함께 ( 의 곱하기 상수가 증가 ) 또는 이진 검색 트리로 증가합니다. 암호화 해시를 사용하여 충돌을 피할 수는 있지만 실제로 암호화 해시는 계산 속도가 매우 느리기 때문에 실제로는 수행되지 않습니다.O ( 1 )
데이터 지역성 을 믹스에 던지면 해시 테이블의 성능이 저하됩니다. 관련 요소를 멀리 떨어져 저장하기 때문에 정확하게 작동합니다. 즉, 응용 프로그램이 접두사를 순서대로 공유하는 요소를 찾는 경우 캐시 효과의 이점을 얻지 못합니다. 응용 프로그램이 본질적으로 무작위 조회를하는 경우에는 관련이 없습니다.
검색 트리를 선호하는 또 다른 요소는 변경 불가능한 데이터 구조라는 것입니다. 트리의 사본을 가져 와서 일부 요소를 변경해야하는 경우 대부분의 데이터 구조를 공유 할 수 있습니다. 해시 테이블의 복사본을 가져 오는 경우 전체 포인터 배열을 복사해야합니다. 또한 순전히 기능적인 언어로 작업하는 경우 해시 테이블은 종종 옵션이 아닙니다.
문자열을 넘어 서면 해시 테이블과 이진 검색 트리는 키의 데이터 유형에 대해 다른 요구 사항을 만듭니다. 해시 테이블에는 해시 함수가 필요합니다 (키에서 정수까지 , 이진 검색 트리에는 총 순서가 필요하지만 키가 저장된 데이터 구조에 충분한 공간이있는 경우 해시를 캐시 할 수 있습니다. 비교 결과 (이진 연산)를 캐싱하는 것은 종종 비실용적입니다. 반면에, 비교는 바로 가기의 이점을 얻을 수 있습니다. 키가 처음 몇 바이트 내에서 종종 다른 경우, 음의 비교는 매우 빠릅니다.케이1≡ k2⟹h ( k1) = h ( k2)
특히 키 순서 를 필요로하는 경우 (예 : 알파벳 순서로 키를 나열하려는 경우) 해시 테이블은 도움이되지 않습니다 (키를 정렬해야 함). 직접 검색 트리를 순회 할 수 있습니다.
이진 검색 트리와 해시 테이블을 해시 트리 형식으로 결합 할 수 있습니다 . 해시 트리는 해시에 따라 검색 트리에 키를 저장합니다. 예를 들어, 계산하기 쉬운 순서 관계가없는 데이터에 대해 작업하려는 순수 기능 프로그래밍 언어에서 유용합니다.
키가 문자열 (또는 정수) 인 경우 trie 는 다른 옵션이 될 수 있습니다. trie는 트리이지만 검색 트리와 다르게 색인화됩니다. 키를 이진법으로 작성하고 0을 위해 왼쪽으로 가고 1을 위해 오른쪽으로갑니다. 액세스 비용은 키 길이에 비례합니다. 중간 노드를 제거하기 위해 트리를 압축 할 수 있습니다. 이것은 patricia trie 또는 기수 나무 로 알려져 있습니다. 기수 트리는 특히 많은 키가 공통 접두사를 공유하는 경우 균형 트리보다 성능이 뛰어납니다.