Каковы преимущества бинарных деревьев поиска над хэш-таблицы?
Хэш-таблицы можно посмотреть какой-либо элемент в Theta (1) времени, и это так же просто, чтобы добавить элемент .... но я не уверен в преимуществах, идущих наоборот.
Каковы преимущества бинарных деревьев поиска над хэш-таблицы?
Хэш-таблицы можно посмотреть какой-либо элемент в Theta (1) времени, и это так же просто, чтобы добавить элемент .... но я не уверен в преимуществах, идущих наоборот.
Одно «преимущество» бинарного дерева является то, что она может быть пройдена в список от всех элементов в порядке. Это не невозможно с таблицей хэширования, но это не нормальная работа один дизайн в структуру хэшированном.
Хеш будет занимать больше места , когда он первый создал - он будет иметь в своем распоряжении слотов для элементов, которые еще должны быть вставлены (независимо от того , или нет они когда - либо вставлены), бинарное дерево поиска будет только как большим , как это необходимо быть. Кроме того , когда хэш-таблица должна больше возможностей, расширения в другой структуре может быть отнимающим много времени, но это может зависеть от реализации.
Помните, что двоичное дерево поиска (на основе ссылок) находятся в памяти эффективной. Они не резервирует больше памяти, чем им нужно.
Например, если хэш - функция имеет диапазон R(h) = 0...100, то вам необходимо выделить массив из 100 (указателей-к) элементов, даже если вы просто хэширования 20 элементов. Если вы должны были использовать дерево двоичного поиска , чтобы сохранить ту же информацию, вы бы только выделить столько места , сколько вам необходимо, а также некоторые метаданные о ссылках.
Бинарное дерево медленнее искать и вставить, но имеет очень хорошую особенность инфиксного обходе, который по существу означает, что вы можете перемещаться по узлам дерева в отсортированном порядке.
Перебор записей в хэш-таблице просто не делает много смысла, потому что все они разбросаны в памяти.
Двоичное дерево поиска может быть реализовано с помощью постоянного интерфейса, где новое дерево возвращается , но старое дерево продолжает существовать. Реализована тщательно, старые и новые деревья акций большинство их узлов. Вы не можете сделать это с помощью стандартной хеш - таблицы.
Основные преимущества бинарного дерева над хэш-таблицы является то, что бинарное дерево дает вам две дополнительные операции, вы не можете сделать (легко, быстро) с хэш-таблицу
найти элемент ближе всего к (не обязательно равно) некоторое произвольному значения ключа (или ближайшие выше / ниже)
перебирать содержимое дерева в отсортированном порядке
Два связаны - бинарное дерево хранит его содержимое в отсортированном порядке, так что вещи, которые требуют, что порядок сортировки легко сделать.
A (сбалансированный) бинарное дерево поиска также имеет то преимущество, что асимптотическая сложность на самом деле является верхней границей, в то время как «постоянные» времена для хэш-таблицы, амортизируются раз: Если у вас есть неподходящий хэш-функцию, вы могли бы в конечном итоге ухудшая к линейному времени , а не постоянная.
Если вы хотите получить доступ к данным в отсортированном порядке, то отсортированный список должен поддерживаться параллельно с хэш - таблицы. Хорошим примером может служить словарь в .NET. (см http://msdn.microsoft.com/en-us/library/3fcwy8h6.aspx ).
Это имеет побочный эффект не только замедляющие вставки, но он потребляет больший объем памяти, чем б-дерево.
Кроме того, поскольку б-дерево отсортировано, просто найти диапазоны результатов, или для выполнения объединения или слияния.
В дополнение ко всем другим хорошие комментарии:
Хэш - таблица в целом имеет лучшее поведение кэша , требующие меньше памяти чтение по сравнению с бинарным деревом. Для хэш - таблицы обычно только влечет за собой ни одного чтения , прежде чем получить доступ к ссылке , проведение данных. Бинарное дерево, если это сбалансированный вариант, требует чего - то в порядке к * Л.Г. (п) память читает для некоторой константы к.
С другой стороны, если противник знает ваш хэш-функцию противник может применять ваш хэш-таблицу, чтобы коллизии, что значительно затрудняет его работу. Чтобы обойти эту проблему, чтобы выбрать хеш-функцию случайным образом из семьи, но BST не имеет этого недостатка. Кроме того, когда давление хэш-таблица становится слишком много, часто, как правило, укрупнить и перераспределить хэш-таблицу, которая может быть дорогостоящей операцией. BST имеет более простое поведение здесь и не склонен внезапно выделять много данных и сделать операцию Rehashing.
Деревья , как правило, в конечном итоге средняя структура данных. Они могут действовать как списки, могут быть легко разделены для параллельной работы, имеют быстрое удаление, вставку и поиск порядка O (Lg п) . Они ничего не делают особенно хорошо, но они не имеют каких - либо слишком плохое поведение либо.
Наконец, BSTs гораздо легче реализовать в (чистые) функциональных языках по сравнению с хэш-таблицами , и они не требуют деструктивных обновлений , которые будут реализованы ( настойчивость аргумента Паскаля выше).
Основное преимущество хеш-таблицы в том, что она делает почти все ОПС в ~ = O (1). И его очень легко понять и реализовать. Это действительно решить многие проблемы «интервью» эффективно. Так что, если и хотят, чтобы взломать интервью кодирования, сделать лучшие друзья с хэш-таблицы ;-)
BSTs также обеспечить «findPredecessor» и операции «findSuccessor» (Для того, чтобы найти следующий наименьший и следующий по величине элементы) в O (LogN) времени, что также может быть очень удобно операции. Хеш таблица не может обеспечить в этой эффективности использования времени.
Это также зависит от использования, Hash позволяет найти точное соответствие. Если вы хотите, чтобы запросить диапазон затем BST является выбором. Предположим, у вас есть много e1 данных, е2, е3 ..... ан.
С хэш-таблицы вы можете найти любой элемент в фиксированное время.
Если вы хотите, чтобы найти диапазон значений больше, чем E41 и менее е8, BST может быстро обнаружить, что.
Главное, хэш-функция используется, чтобы избежать столкновения. Конечно, мы не можем полностью избежать столкновений, в этом случае мы прибегаем к сцеплению или другим методам. Это делает извлечение больше не постоянное время в худшем случае.
После заполнения, хэш-таблица должна снова увеличить размер ковша и скопировать все элементы. Это дополнительные расходы, нет более BST.
Одним из преимуществ, которые никто не указал, что бинарное дерево поиска позволяет эффективно выполнять поиск диапазона.
Для того, чтобы проиллюстрировать свою мысль, я хочу, чтобы сделать крайний случай. Допустим, вы хотите, чтобы получить все элементы, ключи от 0 до 5000. А на самом деле есть только один такой элемент и 10000 других элементов, чьи ключи не в диапазоне. BST можно делать поиск диапазона достаточно эффективно, так как он не ищет поддерево, которое невозможно получить ответ.
В то время, как вы можете сделать поиск диапазона в хэш-таблице? Вы либо должны повторять каждое ведро пространство, которое является O (N), или вы должны искать ли каждый из 1,2,3,4 ... до 5000 существует. (Насчет ключей от 0 до 5000 бесконечное множество? Например клавиши могут быть десятичные)
Хэш таблица представляет собой неупорядоченную структуру данных, при разработке мобильного телефона, вы хотите, чтобы сохранить как можно больше данных, как это возможно для хранения данных. Хэш-таблица представляет собой неупорядоченную структуру данных - это означает, что он не держит его элементов в определенном порядке. Таким образом, если вы используете хэш-таблицу для адресной книги мобильного телефона, то вам потребуется дополнительная память для сортировки значения, потому что вам обязательно нужно будет отображать значения в алфавитном порядке - это адресная книга в конце концов. Таким образом, с помощью хэш-таблицы, вы должны выделить память для сортировки элементов, которые бы в противном случае будет использоваться в качестве места для хранения. Но бинарное дерево поиска представляет собой упорядоченные данные structure.Because бинарное дерево поиска уже отсортирован, то не будет никакой необходимости тратить памяти или времени обработки сортировки записей в сотовом телефоне. Как мы уже упоминали ранее, делает поиск или вставку на бинарное дерево медленнее, чем делать это с хэш-таблицы, но адресная книга сотовый телефон почти никогда не будут иметь более 5000 записей. С таким небольшим количеством записей, O двоичного поиска дерева (журнал (п)), безусловно, будет достаточно быстро. Таким образом, учитывая все, что информация, бинарное дерево поиска является структурой данных, которые вы должны использовать в этом случае, так как это лучший выбор, чем хэш-таблицы.
Хэш таблица не подходит для индексации. Когда вы ищете диапазон, BSTs лучше. Вот причина, почему большинство индексов базы данных используют B + деревья вместо хеш-таблицы
От растрескивание кодирвоание интервью, 6 - е издание
Мы можем реализовать хэш-таблицу со сбалансированным двоичным деревом поиска (BST). Это дает нам O (журнал N) время поиска. Преимущество этого потенциально меньше места, так как мы больше не выделить большой массив. Мы также можем перебирать ключи в порядке, которые могут быть полезны иногда.
Классы HashSet и Таблица неупорядоченные коллекции. Это не очевидно из интерфейса (и может быть иначе) , но хэш - таблицы были реализованы с помощью AVL деревья. Это означает , что хэш - код не уменьшается по модулю массива (меньше столкновений) , и это также означает , что нет перепевы массива , чтобы сделать ( более гладкой производительности). Дело в том , что они являются неупорядоченные коллекции означает , что вы только поставить равенства функции и функции Hashcode - не полный компаратор , как и для деревьев. Так ли вы использовать хэш - таблицу Таблицу <K, T> или бинарное дерево Tree <K, T> зависит от класса К - является ли она в полной мере сопоставимая или только равенство сопоставимая.
Есть случаи, когда тип данных и сопоставимости и равенство сопоставимого - как String. Это означает, что HashSet <String> и Set <String> оба возможно. Поисковые запросы на хэш набора строк, как правило, примерно в 10 раз быстрее, чем на поиски упорядоченного набора строк. Если компаратор дорого, то деревья замедлиться по сравнению с HashTables. Если компаратор быстро, (например, для целых чисел и поплавков), то деревья будут работать быстрее, чем хэш-таблицы.
HashMap лучше представляет собой набор ассоциативного массива. Таким образом, ваш массив входных значений получает объединен в ведра. В открытой схеме адресации, то есть указатель на ведро, и каждый раз, когда вы добавляете новое значение в ведро, вы узнаете, где в ведре есть свободные места. Есть несколько способов сделать this- вы начинаете в начале ковша и увеличить указатель каждый раз, и проверить, является ли его занято. Это называется линейным зондированием. Затем вы можете сделать бинарный поиск, как добавление, где вы удвоить разницу между началом ковша и где вы удвоить или вниз каждый раз, когда вы ищете свободное пространство. Это называется квадратичным зондированием. ОК. Теперь проблемы в обоих этих методов состоит в том, что если ведро перетекает в следующих ведер адрес, то вам необходимо to-
ОК. но если вы используете LinkedList не должно быть такой проблемой, не так ли? Да, в связанных списках вы не имеете эту проблему. Учитывая каждое ведро, чтобы начать с связанным списком, и если у вас есть 100 элементов в ведре она требует от вас, чтобы пройти эти 100 элементов, чтобы достигнуть конца LinkedList, следовательно, List.add (элемент E) потребуется время TO-
Преимущество реализации LinkedList является то, что вам не нужна операция выделения памяти и O (N) передач / копия всех ковшей, как и в случае открытой адресации реализации.
Таким образом, способ минимизировать O (N) операции заключается в преобразовании реализации в том, что из бинарного дерева поиска, где найти операции являются O (журнал (N)) и вы добавляете элемент в своей позиции на основе его значение. Добавленная особенность BST является то, что он приходит сортируется!
Бинарные дерева поиска хороший выбор для реализации словаря, если ключи имеют некоторый общий порядок (ключи сопоставимы), определенный на них, и вы хотите сохранить информацию о заказе.
Как BST сохраняет информацию о заказе, она предоставляет вам четыре дополнительных операций динамического набора, которые не могут быть выполнены (эффективно) с использованием хэш-таблицы. Эти операции являются:
Все эти операции, как любая операция BST имеют временную сложность O (H). Кроме того, все сохраненные ключи остаются отсортирован в BST, таким образом, что позволяет получить отсортированный последовательность клавиш просто путем обхода дерева в в-порядке.
Таким образом, если все, что вы хотите, операции вставки, удаления и удалить, то хэш-таблицу непобедим (большую часть времени) в исполнении. Но если вы хотите какой-либо или все операции, перечисленные выше, вы должны использовать BST, предпочтительно самобалансирующейся BST.
Бинарные деревья поиска могут быть быстрее при использовании строковых ключей. Особенно, когда строки длинны.
Бинарные деревья поиска с помощью сравнения меньше / больше, которые быстро строк (если они не равны). Поэтому BST может быстро ответить, когда строка не найдена. Когда он обнаружил, что нужно будет сделать только один полное сравнение.
В хэш-таблице. Вам нужно вычислить хэш строки, и это означает, что вы должны пройти через все байты, по крайней мере один раз, чтобы вычислить хэш. Затем снова, когда соответствующая запись найдена.