Вы можете получить доступ к элементам только по их первичному ключу в хеш-таблице. Это быстрее, чем с древовидным алгоритмом ( O(1)
вместоlog(n)
), но вы не можете выбирать диапазоны ( все, что находится между x
иy
). Алгоритмы дерева поддерживают это, Log(n)
тогда как хеш-индексы могут привести к полному сканированию таблицы O(n)
. Кроме того, постоянные накладные расходы на хеш-индексы обычно больше ( что не является фактором в тета-нотации, но все же существует ). Кроме того, древовидные алгоритмы обычно легче поддерживать, увеличивать вместе с данными, масштабировать и т. Д.
Индексы хеширования работают с заранее определенными размерами хешей, так что в итоге вы получаете несколько «корзин», в которых хранятся объекты. Эти объекты снова зацикливаются, чтобы действительно найти нужный внутри этого раздела.
Таким образом, если у вас маленькие размеры, у вас много накладных расходов на мелкие элементы, большие размеры приводят к дальнейшему сканированию.
Современные алгоритмы хэш-таблиц обычно масштабируются, но масштабирование может быть неэффективным.
Действительно, существуют масштабируемые алгоритмы хеширования. Не спрашивайте меня, как это работает - для меня это тоже загадка. AFAIK они эволюционировали из масштабируемой репликации, где повторное хеширование не так просто.
Его называют РАШ - R eplication U NDER S calable Н озоления, и эти алгоритмы, таким образом , называют алгоритмы Раша.
Однако может быть момент, когда ваш индекс превышает допустимый размер по сравнению с размером вашего хэша, и весь ваш индекс необходимо перестроить. Обычно это не проблема, но для огромных-огромных-огромных баз данных это может занять несколько дней.
Компромисс для древовидных алгоритмов невелик, и они подходят почти для каждого случая использования и поэтому используются по умолчанию.
Однако, если у вас есть очень точный вариант использования и вы точно знаете, что и только что вам понадобится, вы можете воспользоваться преимуществами индексов хеширования.