Авл-дерево и B-дерево

чем дерево AVL отличается от B-дерева?

9 ответов


деревья AVL предназначены для использования в памяти, где случайный доступ относительно дешев. B-деревья лучше подходят для хранения на диске, поскольку они группируют большее количество ключей в каждом узле, чтобы минимизировать количество запросов, требуемых операцией чтения или записи. (Вот почему б-деревья часто используются в файловых системах и базах данных, таких как SQLite.)


и дерево AVL, и дерево B похожи в том, что они являются структурами данных, которые в силу своих требований заставляют высоту их соответствующих деревьев быть минимизированными. Эта "короткость" позволяет выполнять поиск за O (log n) время, так как максимально возможное количество считываний соответствует высоте дерева.

    5
   / \
  3   7
 /   / \
1   6   9

Это дерево AVL и является двоичным деревом поиска в его ядре. Однако это самобалансировка, что означает, что при добавлении элементов в дерево, оно реструктурирует себя, чтобы поддерживать как можно более равномерную высоту. В принципе, это не позволит длинные ветви.

B-tree также делает это, но через другую схему балансировки. Это немного слишком сложно написать, но если вы ищете Google "B-tree animation", есть некоторые действительно хорошие апплеты, которые объясняют B-tree довольно хорошо.

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

когда сбор данных настолько велик, что он не вписывается память, решение-это B-дерево (интересный факт: нет консенсуса относительно того, что на самом деле означает "B"). B-дерево содержит много дочерних узлов в одном узле и много указателей на дочерний узел. Таким образом, во время чтения диска (которое может занять около 10 мс для чтения одного дискового блока) возвращается максимальный объем соответствующих данных узла, а также указатели на "листовые узлы" дисковых блоков. Это позволяет амортизировать время извлечения данных в журнал (n), что делает B-дерево особенно полезным для базы данных и реализации извлечения больших наборов данных.


дерево AVL-это самобалансирующееся двоичное дерево поиска, сбалансированное для поддержания высоты O(log n).

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


AVL балансирует себя, гарантируя, что все операции O(log n) в среднем и худших случаях.


B-tree использует все идеи, описанные выше. В частности, B-дерево:

1)keeps keys in sorted order for sequential traversing
2)uses a hierarchical index to minimize the number of disk reads
3)uses partially full blocks to speed insertions and deletions
4)keeps the index balanced with an elegant recursive algorithm

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


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

B-дерево в основном используется в качестве дерева поиска с поддержкой хранилища для очень больших наборов данных, поскольку оно требует меньше чтения на диск (так как каждый узел содержит N ключей, где N >1). B-дерево называется A (N,N+1) B-дерево, где N-количество ключей на узел, а N+1-число детей на узел. Чем больше ключей на узел, тем меньше раз вам нужно будет читать с диска, и это также будет более мелкое дерево (меньше уровней).


Они действительно очень разные, хотя они служат в основном той же цели: поддержка ассоциативной таблицы. Исторически сложилось так, что дерево AVL было принято, чтобы превзойти B-дерево для операций в памяти, но это особенно верно, когда доступ к памяти был дешевым(er) по сравнению с циклами процессора.

хотя обычно используется в хранилище баз данных для ключей переменной длины, B-деревья лучше всего работают для фиксированной длины и коротких записей (ключ + данные). Для таких применений, которые могут значительно превосходят деревья AVL для использования в памяти, как с точки зрения объема памяти (поскольку они хранят данные более компактно), так и скорости (у них было бы намного лучше локальность кэша).

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


с точки зрения обывателя -

дерево AVL и дерево двоичного поиска одинаковы, но дерево AVL имеет ограничение, что разница между высотой левого под-дерева и правого под-дерева должна быть 0, 1 или -1.

Если любое дерево двоичного поиска удовлетворяет этим условиям, оно будет называться деревом AVL.

бинарное дерево поиска + условие высоты является деревом AVL.

см.: введение в алгоритмы по Кормен https://books.google.co.in/books...


другие ответчики уже предоставили довольно подробные технические данные о AVL и B-Tree, но я хотел бы добавить относительно новичок информацию об этих двух:) -

  • дерево AVL является двоичным деревом, в то время как B-дерево является многовходовым деревом (N-ary tree), т. е. любым узлом в дерево AVL может быть максимум два дочерних узла и один кусок информации / данных пока любой узел в B-tree может быть n узлы и N-1 порция информации/данных. Для B-дерева n также известен как его порядок.