n
Коротка відповідь полягає в тому, що хеш-таблиці в більшості випадків швидші , але в гіршому випадку можуть бути дуже поганими. Пошукові дерева мають багато переваг, включаючи ручне поведінку в гіршому випадку , але в типових випадках дещо повільніше.
O(lg(n))log2(n)
2nO(1)
O(1)
Коли ви кидаєте локальність даних у суміш, хеш-таблиці погано працюють. Вони працюють саме тому, що вони зберігають пов'язані елементи далеко один від одного, а це означає, що якщо програма шукає елементи, що мають спільний префікс послідовно, це не отримає користі від ефектів кешу. Це не актуально, якщо програма робить по суті випадкові пошуки.
Ще одним фактором на користь дерев пошуку є те, що вони є незмінною структурою даних: якщо вам потрібно скопіювати копію дерева та змінити кілька елементів у ньому, ви можете поділитися більшою частиною структури даних. Якщо ви берете копію хеш-таблиці, вам потрібно скопіювати весь масив покажчиків. Крім того, якщо ви працюєте виключно функціональними мовами, хеш-таблиці часто не є варіантом.
k1≡k2⟹h(k1)=h(k2)
Зокрема, якщо вам знадобиться порядок на клавішах, наприклад, якщо ви хочете мати можливість перелічити ключі в алфавітному порядку, то хеш-таблиці не допоможуть (вам потрібно буде їх сортувати), тоді як ви може прямо перетинати дерево пошуку по порядку.
Можна поєднувати двійкові дерева пошуку та хеш-таблиці у вигляді хеш-дерев . Хеш-дерево зберігає ключі в дереві пошуку відповідно до їх хешу. Це корисно, наприклад, у суто функціональній мові програмування, де потрібно працювати над даними, які не мають простого для обчислення відношення порядку.
Коли ключі - це рядки (або цілі числа), трие може бути іншим варіантом. Трие - це дерево, але індексоване інакше, ніж дерево пошуку: ви пишете ключ у двійковій формі, а ліворуч - на 0 і вправо на 1. Вартість доступу, таким чином, пропорційна довжині ключа. Спроби можна стиснути, щоб видалити проміжні вузли; це відоме як патріція трие або радіксне дерево . Дерева Radix можуть перевершувати збалансовані дерева, особливо коли багато клавіш мають спільний префікс.