Преимущества бинарных деревьев поиска над Hash Tables

голоса
81

Каковы преимущества бинарных деревьев поиска над хэш-таблицы?

Хэш-таблицы можно посмотреть какой-либо элемент в Theta (1) времени, и это так же просто, чтобы добавить элемент .... но я не уверен в преимуществах, идущих наоборот.

Задан 08/11/2010 в 23:06
источник пользователем
На других языках...                            


20 ответов

голоса
70

Одно «преимущество» бинарного дерева является то, что она может быть пройдена в список от всех элементов в порядке. Это не невозможно с таблицей хэширования, но это не нормальная работа один дизайн в структуру хэшированном.

Ответил 08/11/2010 в 23:11
источник пользователем

голоса
9

Хеш будет занимать больше места , когда он первый создал - он будет иметь в своем распоряжении слотов для элементов, которые еще должны быть вставлены (независимо от того , или нет они когда - либо вставлены), бинарное дерево поиска будет только как большим , как это необходимо быть. Кроме того , когда хэш-таблица должна больше возможностей, расширения в другой структуре может быть отнимающим много времени, но это может зависеть от реализации.

Ответил 08/11/2010 в 23:11
источник пользователем

голоса
76

Помните, что двоичное дерево поиска (на основе ссылок) находятся в памяти эффективной. Они не резервирует больше памяти, чем им нужно.

Например, если хэш - функция имеет диапазон R(h) = 0...100, то вам необходимо выделить массив из 100 (указателей-к) элементов, даже если вы просто хэширования 20 элементов. Если вы должны были использовать дерево двоичного поиска , чтобы сохранить ту же информацию, вы бы только выделить столько места , сколько вам необходимо, а также некоторые метаданные о ссылках.

Ответил 08/11/2010 в 23:11
источник пользователем

голоса
6

Бинарное дерево медленнее искать и вставить, но имеет очень хорошую особенность инфиксного обходе, который по существу означает, что вы можете перемещаться по узлам дерева в отсортированном порядке.

Перебор записей в хэш-таблице просто не делает много смысла, потому что все они разбросаны в памяти.

Ответил 08/11/2010 в 23:13
источник пользователем

голоса
8

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

Ответил 08/11/2010 в 23:19
источник пользователем

голоса
23

Основные преимущества бинарного дерева над хэш-таблицы является то, что бинарное дерево дает вам две дополнительные операции, вы не можете сделать (легко, быстро) с хэш-таблицу

  • найти элемент ближе всего к (не обязательно равно) некоторое произвольному значения ключа (или ближайшие выше / ниже)

  • перебирать содержимое дерева в отсортированном порядке

Два связаны - бинарное дерево хранит его содержимое в отсортированном порядке, так что вещи, которые требуют, что порядок сортировки легко сделать.

Ответил 08/11/2010 в 23:25
источник пользователем

голоса
14

A (сбалансированный) бинарное дерево поиска также имеет то преимущество, что асимптотическая сложность на самом деле является верхней границей, в то время как «постоянные» времена для хэш-таблицы, амортизируются раз: Если у вас есть неподходящий хэш-функцию, вы могли бы в конечном итоге ухудшая к линейному времени , а не постоянная.

Ответил 08/11/2010 в 23:29
источник пользователем

голоса
1

Если вы хотите получить доступ к данным в отсортированном порядке, то отсортированный список должен поддерживаться параллельно с хэш - таблицы. Хорошим примером может служить словарь в .NET. (см http://msdn.microsoft.com/en-us/library/3fcwy8h6.aspx ).

Это имеет побочный эффект не только замедляющие вставки, но он потребляет больший объем памяти, чем б-дерево.

Кроме того, поскольку б-дерево отсортировано, просто найти диапазоны результатов, или для выполнения объединения или слияния.

Ответил 08/11/2010 в 23:34
источник пользователем

голоса
48

В дополнение ко всем другим хорошие комментарии:

Хэш - таблица в целом имеет лучшее поведение кэша , требующие меньше памяти чтение по сравнению с бинарным деревом. Для хэш - таблицы обычно только влечет за собой ни одного чтения , прежде чем получить доступ к ссылке , проведение данных. Бинарное дерево, если это сбалансированный вариант, требует чего - то в порядке к * Л.Г. (п) память читает для некоторой константы к.

С другой стороны, если противник знает ваш хэш-функцию противник может применять ваш хэш-таблицу, чтобы коллизии, что значительно затрудняет его работу. Чтобы обойти эту проблему, чтобы выбрать хеш-функцию случайным образом из семьи, но BST не имеет этого недостатка. Кроме того, когда давление хэш-таблица становится слишком много, часто, как правило, укрупнить и перераспределить хэш-таблицу, которая может быть дорогостоящей операцией. BST имеет более простое поведение здесь и не склонен внезапно выделять много данных и сделать операцию Rehashing.

Деревья , как правило, в конечном итоге средняя структура данных. Они могут действовать как списки, могут быть легко разделены для параллельной работы, имеют быстрое удаление, вставку и поиск порядка O (Lg п) . Они ничего не делают особенно хорошо, но они не имеют каких - либо слишком плохое поведение либо.

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

Ответил 09/11/2010 в 01:01
источник пользователем

голоса
-1

Основное преимущество хеш-таблицы в том, что она делает почти все ОПС в ~ = O (1). И его очень легко понять и реализовать. Это действительно решить многие проблемы «интервью» эффективно. Так что, если и хотят, чтобы взломать интервью кодирования, сделать лучшие друзья с хэш-таблицы ;-)

Ответил 05/04/2011 в 00:45
источник пользователем

голоса
4

BSTs также обеспечить «findPredecessor» и операции «findSuccessor» (Для того, чтобы найти следующий наименьший и следующий по величине элементы) в O (LogN) времени, что также может быть очень удобно операции. Хеш таблица не может обеспечить в этой эффективности использования времени.

Ответил 20/09/2012 в 18:55
источник пользователем

голоса
1

Это также зависит от использования, Hash позволяет найти точное соответствие. Если вы хотите, чтобы запросить диапазон затем BST является выбором. Предположим, у вас есть много e1 данных, е2, е3 ..... ан.

С хэш-таблицы вы можете найти любой элемент в фиксированное время.

Если вы хотите, чтобы найти диапазон значений больше, чем E41 и менее е8, BST может быстро обнаружить, что.

Главное, хэш-функция используется, чтобы избежать столкновения. Конечно, мы не можем полностью избежать столкновений, в этом случае мы прибегаем к сцеплению или другим методам. Это делает извлечение больше не постоянное время в худшем случае.

После заполнения, хэш-таблица должна снова увеличить размер ковша и скопировать все элементы. Это дополнительные расходы, нет более BST.

Ответил 29/01/2013 в 15:54
источник пользователем

голоса
94

Одним из преимуществ, которые никто не указал, что бинарное дерево поиска позволяет эффективно выполнять поиск диапазона.

Для того, чтобы проиллюстрировать свою мысль, я хочу, чтобы сделать крайний случай. Допустим, вы хотите, чтобы получить все элементы, ключи от 0 до 5000. А на самом деле есть только один такой элемент и 10000 других элементов, чьи ключи не в диапазоне. BST можно делать поиск диапазона достаточно эффективно, так как он не ищет поддерево, которое невозможно получить ответ.

В то время, как вы можете сделать поиск диапазона в хэш-таблице? Вы либо должны повторять каждое ведро пространство, которое является O (N), или вы должны искать ли каждый из 1,2,3,4 ... до 5000 существует. (Насчет ключей от 0 до 5000 бесконечное множество? Например клавиши могут быть десятичные)

Ответил 11/11/2013 в 01:05
источник пользователем

голоса
0

Хэш таблица представляет собой неупорядоченную структуру данных, при разработке мобильного телефона, вы хотите, чтобы сохранить как можно больше данных, как это возможно для хранения данных. Хэш-таблица представляет собой неупорядоченную структуру данных - это означает, что он не держит его элементов в определенном порядке. Таким образом, если вы используете хэш-таблицу для адресной книги мобильного телефона, то вам потребуется дополнительная память для сортировки значения, потому что вам обязательно нужно будет отображать значения в алфавитном порядке - это адресная книга в конце концов. Таким образом, с помощью хэш-таблицы, вы должны выделить память для сортировки элементов, которые бы в противном случае будет использоваться в качестве места для хранения. Но бинарное дерево поиска представляет собой упорядоченные данные structure.Because бинарное дерево поиска уже отсортирован, то не будет никакой необходимости тратить памяти или времени обработки сортировки записей в сотовом телефоне. Как мы уже упоминали ранее, делает поиск или вставку на бинарное дерево медленнее, чем делать это с хэш-таблицы, но адресная книга сотовый телефон почти никогда не будут иметь более 5000 записей. С таким небольшим количеством записей, O двоичного поиска дерева (журнал (п)), безусловно, будет достаточно быстро. Таким образом, учитывая все, что информация, бинарное дерево поиска является структурой данных, которые вы должны использовать в этом случае, так как это лучший выбор, чем хэш-таблицы.

Ответил 26/12/2013 в 17:40
источник пользователем

голоса
0

Хэш таблица не подходит для индексации. Когда вы ищете диапазон, BSTs лучше. Вот причина, почему большинство индексов базы данных используют B + деревья вместо хеш-таблицы

Ответил 05/04/2015 в 17:34
источник пользователем

голоса
4

От растрескивание кодирвоание интервью, 6 - е издание

Мы можем реализовать хэш-таблицу со сбалансированным двоичным деревом поиска (BST). Это дает нам O (журнал N) время поиска. Преимущество этого потенциально меньше места, так как мы больше не выделить большой массив. Мы также можем перебирать ключи в порядке, которые могут быть полезны иногда.

Ответил 29/05/2016 в 18:47
источник пользователем

голоса
-1

Классы HashSet и Таблица неупорядоченные коллекции. Это не очевидно из интерфейса (и может быть иначе) , но хэш - таблицы были реализованы с помощью AVL деревья. Это означает , что хэш - код не уменьшается по модулю массива (меньше столкновений) , и это также означает , что нет перепевы массива , чтобы сделать ( более гладкой производительности). Дело в том , что они являются неупорядоченные коллекции означает , что вы только поставить равенства функции и функции Hashcode - не полный компаратор , как и для деревьев. Так ли вы использовать хэш - таблицу Таблицу <K, T> или бинарное дерево Tree <K, T> зависит от класса К - является ли она в полной мере сопоставимая или только равенство сопоставимая.

Есть случаи, когда тип данных и сопоставимости и равенство сопоставимого - как String. Это означает, что HashSet <String> и Set <String> оба возможно. Поисковые запросы на хэш набора строк, как правило, примерно в 10 раз быстрее, чем на поиски упорядоченного набора строк. Если компаратор дорого, то деревья замедлиться по сравнению с HashTables. Если компаратор быстро, (например, для целых чисел и поплавков), то деревья будут работать быстрее, чем хэш-таблицы.

Ответил 19/08/2017 в 03:24
источник пользователем

голоса
0

HashMap лучше представляет собой набор ассоциативного массива. Таким образом, ваш массив входных значений получает объединен в ведра. В открытой схеме адресации, то есть указатель на ведро, и каждый раз, когда вы добавляете новое значение в ведро, вы узнаете, где в ведре есть свободные места. Есть несколько способов сделать this- вы начинаете в начале ковша и увеличить указатель каждый раз, и проверить, является ли его занято. Это называется линейным зондированием. Затем вы можете сделать бинарный поиск, как добавление, где вы удвоить разницу между началом ковша и где вы удвоить или вниз каждый раз, когда вы ищете свободное пространство. Это называется квадратичным зондированием. ОК. Теперь проблемы в обоих этих методов состоит в том, что если ведро перетекает в следующих ведер адрес, то вам необходимо to-

  1. Дважды каждый ковши Размер- таНос (N ведро) / изменить хэш функции- Необходимое время: зависит от реализации таНоса
  2. Передача / Копирование каждой из более ранних данных ведер в новые данные ведер. Это операция O (N), где N представляет собой целое данные

ОК. но если вы используете LinkedList не должно быть такой проблемой, не так ли? Да, в связанных списках вы не имеете эту проблему. Учитывая каждое ведро, чтобы начать с связанным списком, и если у вас есть 100 элементов в ведре она требует от вас, чтобы пройти эти 100 элементов, чтобы достигнуть конца LinkedList, следовательно, List.add (элемент E) потребуется время TO-

  1. Хеширования элемента к bucket- Нормальный, как во всех реализациях
  2. Потратьте время, чтобы найти последний элемент в указанном bucket- O (N) операций.

Преимущество реализации LinkedList является то, что вам не нужна операция выделения памяти и O (N) передач / копия всех ковшей, как и в случае открытой адресации реализации.

Таким образом, способ минимизировать O (N) операции заключается в преобразовании реализации в том, что из бинарного дерева поиска, где найти операции являются O (журнал (N)) и вы добавляете элемент в своей позиции на основе его значение. Добавленная особенность BST является то, что он приходит сортируется!

Ответил 20/08/2017 в 23:24
источник пользователем

голоса
0

Бинарные дерева поиска хороший выбор для реализации словаря, если ключи имеют некоторый общий порядок (ключи сопоставимы), определенный на них, и вы хотите сохранить информацию о заказе.

Как BST сохраняет информацию о заказе, она предоставляет вам четыре дополнительных операций динамического набора, которые не могут быть выполнены (эффективно) с использованием хэш-таблицы. Эти операции являются:

  1. максимальная
  2. минимальный
  3. правопреемник
  4. предок

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

Таким образом, если все, что вы хотите, операции вставки, удаления и удалить, то хэш-таблицу непобедим (большую часть времени) в исполнении. Но если вы хотите какой-либо или все операции, перечисленные выше, вы должны использовать BST, предпочтительно самобалансирующейся BST.

Ответил 19/05/2018 в 16:46
источник пользователем

голоса
0

Бинарные деревья поиска могут быть быстрее при использовании строковых ключей. Особенно, когда строки длинны.

Бинарные деревья поиска с помощью сравнения меньше / больше, которые быстро строк (если они не равны). Поэтому BST может быстро ответить, когда строка не найдена. Когда он обнаружил, что нужно будет сделать только один полное сравнение.

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

Ответил 13/10/2018 в 11:32
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more