Как выбрать между хеш-таблицей и Trie (префиксным деревом)?

Итак, если мне нужно выбирать между хеш-таблицей 9X_trie или префиксным деревом, каковы отличительные 9X_hashtable факторы, которые заставят меня выбрать одно 9X_algorithm из них. С моей собственной наивной точки 9X_algorithm зрения кажется, что использование trie связано 9X_data-structures с некоторыми дополнительными накладными 9X_trie расходами, поскольку оно не хранится в виде 9X_trie массива, но с точки зрения времени выполнения 9X_hashtable (при условии, что самый длинный ключ - это 9X_hashtable самое длинное английское слово), это может 9X_algorithm-design быть по существу O (1) (относительно верхней 9X_algorithm-design границы). Может быть, самое длинное английское 9X_algorithm-design слово состоит из 50 символов?

Хеш-таблицы 9X_algorithm можно быстро найти, как только вы получите индекс. Однако хеширование 9X_data-structures ключа для получения индекса может легко 9X_hashtable занять около 50 шагов.

Может ли кто-нибудь 9X_data-structures дать мне более опытный взгляд на это? Спасибо!

162
1

  • Стоит отметить, что дерево редиксов более эффективно, чем обычное дерево, потому что вам не нужна новая ветвь для каждого байта строки. Кроме того, деревья ...
7
Общее количество ответов: 7

Ответ #1

Ответ на вопрос: Как выбрать между хеш-таблицей и Trie (префиксным деревом)?

Преимущества попыток:

Основы:

  • Прогнозируемое время поиска O (k), где k - размер ключа.
  • Поиск может занять меньше k раз, если его там нет
  • Поддерживает упорядоченный обход.
  • Нет необходимости в хэш-функции.
  • Удалить просто

Новые операции:

  • Вы можете быстро найти префиксы ключей, перечислить все записи с заданным префиксом и т. д.

Преимущества 9X_algorithm связанной структуры:

  • Если существует много общих префиксов, пространство, которое им требуется, является общим.
  • Неизменяемые попытки могут иметь общую структуру. Вместо того, чтобы обновлять дерево на месте, вы можете создать новый, который отличается только в одной ветке, а в другом месте указывает на старое дерево. Это может быть полезно для параллелизма, одновременного использования нескольких версий таблицы и т. Д.
  • Неизменяемое дерево можно сжимать. То есть, он также может разделять структуру суффиксов за счет хеширования.

Преимущества хэш-таблиц:

  • Все знают хэш-таблицы, верно? У вашей системы уже будет хорошая, хорошо оптимизированная реализация, быстрее, чем в большинстве случаев.
  • У ваших ключей нет особой структуры.
  • Более компактно, чем очевидная структура связанного дерева (см. комментарии ниже).

137
4

  • Обработка планов телефонной нумерации @DariusBacon кажется разумным сценарием для попыток. Пример сценар ...

Ответ #2

Ответ на вопрос: Как выбрать между хеш-таблицей и Trie (префиксным деревом)?

Все зависит от того, какую проблему вы пытаетесь 9X_trie решить. Если все, что вам нужно сделать, это 9X_algorithms вставки и поиск, используйте хеш-таблицу. Если 9X_algorithms вам нужно решить более сложные проблемы, такие 9X_hashtable как запросы, связанные с префиксом, то лучшим 9X_algorithms решением может быть trie.

50
2

  • На мой взгляд, хеш-таблица выполняет _вычисления_ на строковом входе, тогда как trie выполняет _поиск адресов_ на строковом вводе. Поиск адресов может пропускать кеш, тогда как вычисления, я думаю, выполняются намного быстрее, поскольку они н ...

Ответ #3

Ответ на вопрос: Как выбрать между хеш-таблицей и Trie (префиксным деревом)?

Все знают хеш-таблицу и ее использование, но 9X_trie это не совсем постоянное время поиска, это 9X_data-structure зависит от размера хеш-таблицы, вычислительной 9X_trie сложности хеш-функции.

Создание огромных 9X_data-structures хеш-таблиц для эффективного поиска не является 9X_trie изящным решением в большинстве промышленных 9X_algorithm сценариев, где важна даже небольшая задержка 9X_data-structure / масштабируемость (например, высокочастотная 9X_algorithm торговля). Вы должны позаботиться о том, чтобы 9X_algorithm структуры данных были оптимизированы для 9X_trie пространства, которое они занимают в памяти, чтобы 9X_hashtable уменьшить промахи в кэше.

Очень хороший пример, когда 9X_algorithm trie лучше соответствует требованиям, - это 9X_hashtable промежуточное ПО для обмена сообщениями. У 9X_data-structures вас есть миллион подписчиков и издателей 9X_hashtable сообщений в различных категориях (в терминах 9X_data-structure JMS - темы или обмены), в таких случаях, если 9X_trie вы хотите отфильтровать сообщения на основе 9X_data-structures тем (которые на самом деле являются строками), вы 9X_data-structures определенно не хотите создавать хеш-таблицу. за 9X_algorithm миллион подписок с миллионом тем. Лучшим 9X_algorithm-design подходом является хранение тем в trie, поэтому, когда 9X_data-structure фильтрация выполняется на основе совпадения 9X_trie тем, ее сложность не зависит от количества 9X_algorithms тем / подписок / издателей (зависит только 9X_trie от длины строки). Мне это нравится, потому 9X_data-structure что вы можете проявить творческий подход 9X_algorithm к этой структуре данных, чтобы оптимизировать 9X_hashtable требования к пространству и, следовательно, снизить 9X_hashtable промах в кеш-памяти.

35
0

Ответ #4

Ответ на вопрос: Как выбрать между хеш-таблицей и Trie (префиксным деревом)?

Используйте дерево:

  1. Если вам нужна функция автозаполнения
  2. Найдите все слова, начинающиеся с "а" или "топор" и т. д.
  3. Суффиксное дерево - это особая форма дерева. У суффиксных деревьев есть целый список преимуществ, которые не могут быть покрыты хешем.

9X_data-structure

14
0

Ответ #5

Ответ на вопрос: Как выбрать между хеш-таблицей и Trie (префиксным деревом)?

Есть кое-что, о чем я не видел, чтобы кто-то 9X_algorithm прямо упоминал, что, на мой взгляд, важно 9X_hashtable помнить. Как хеш-таблицы, так и попытки 9X_data-structures различных типов обычно содержат операции 9X_algorithm O(k), где k - длина строки в битах (или, что 9X_algorithm эквивалентно, в символах).

Предполагается, что 9X_data-structures у вас есть хорошая хеш-функция. Если вы 9X_algorithm-design не хотите, чтобы "ферма" и "животные на 9X_algorithms ферме" хешировали одно и то же значение, тогда 9X_data-structures хеш-функция должна будет использовать все 9X_data-structures биты ключа, и поэтому хеширование "сельскохозяйственных 9X_algorithm животных" должно занять примерно в два раза 9X_algorithm больше времени, чем «ферма» (если вы не 9X_data-structure находитесь в каком-либо сценарии скользящего 9X_algorithm-design хеширования, но есть несколько схожие сценарии 9X_algorithm-design сохранения операций с попытками). А с ванильным 9X_data-structure деревом понятно, почему вставка «сельскохозяйственных 9X_data-structures животных» займет примерно вдвое больше времени, чем 9X_algorithm просто «ферма». В конечном итоге это верно 9X_data-structure и для сжатых попыток.

6
0

Ответ #6

Ответ на вопрос: Как выбрать между хеш-таблицей и Trie (префиксным деревом)?

Вставка и поиск в дереве линейны в зависимости 9X_algorithm от длины входной строки O (s).

Хеш даст вам 9X_hashtable O (1) для поиска и вставки, но сначала вы 9X_trie должны вычислить хеш на основе входной строки, которая 9X_data-structures снова равна O (s).

Вывод: асимптотическая 9X_algorithms временная сложность в обоих случаях линейна.

У 9X_algorithm-design дерева есть дополнительные накладные расходы 9X_hashtable с точки зрения данных, но вы можете выбрать 9X_algorithm-design сжатое дерево, которое снова более или менее 9X_trie увяжет вас с хеш-таблицей.

Чтобы решить эту 9X_algorithms проблему, задайте себе вопрос: нужно ли 9X_algorithms искать только полные слова? Или мне нужно 9X_algorithms вернуть все слова, соответствующие префиксу? (Как 9X_trie в системе интеллектуального ввода текста). В 9X_algorithm-design первом случае используйте хеш. Это более 9X_data-structure простой и чистый код. Легче тестировать 9X_data-structure и поддерживать. Для более детального использования 9X_algorithm префиксов или суфиксов используйте дерево.

А 9X_algorithms если вы делаете это просто для удовольствия, реализация 9X_hashtable дерева поможет воскресному дню найти хорошее 9X_algorithm применение.

6
0

Ответ #7

Ответ на вопрос: Как выбрать между хеш-таблицей и Trie (префиксным деревом)?

Реализация HashTable занимает меньше места по сравнению 9X_algorithms с базовой реализацией Trie. Но со строками порядок 9X_hashtable необходим в большинстве практических приложений. Но 9X_data-structure HashTable полностью нарушает лексографический 9X_hashtable порядок. Теперь, если ваше приложение выполняет 9X_data-structures операции, основанные на лексографическом 9X_algorithms порядке (например, частичный поиск, все 9X_algorithms строки с заданным префиксом, все слова в 9X_data-structure отсортированном порядке), вы должны использовать 9X_algorithms Tries. HashTable следует использовать только 9X_data-structure для поиска (возможно, это дает минимальное 9X_algorithms время поиска).

P.S .: Помимо этого, троичные деревья поиска (TST) были бы отличным 9X_data-structure выбором. Время поиска у него больше, чем 9X_hashtable у HashTable, но он эффективен по времени 9X_data-structures во всех других операциях. Кроме того, он 9X_trie более эффективен, чем пытается.

2
0