И дерево AVL, и B-дерево схожи в том, что они являются структурами данных, которые благодаря своим требованиям минимизируют высоту их соответствующих деревьев. Эта «краткость» позволяет выполнять поиск за время O (log n), поскольку максимально возможное число операций чтения соответствует высоте дерева.
5
/ \
3 7
/ / \
1 6 9
Это дерево AVL и ядро двоичного поиска. Однако он самобалансирующийся, что означает, что при добавлении элементов в дерево оно будет реструктурироваться, чтобы поддерживать как можно более равномерную высоту. В принципе, это не допустит длинных ветвей.
B-дерево также делает это, но через другую схему перебалансировки. Это немного сложно написать, но если вы ищете в Google «Анимация B-дерева», есть несколько действительно хороших апплетов, которые достаточно хорошо объясняют B-дерево.
Они отличаются тем, что дерево AVL реализовано с учетом решений на основе памяти, а дерево B реализовано с учетом решений на основе дисков. Деревья AVL не предназначены для хранения огромных коллекций данных, так как они используют динамическое распределение памяти и указатели на следующий блок памяти. Очевидно, мы могли бы реплицировать функциональность дерева AVL с указанием расположения дисков и указателей дисков, но это было бы намного медленнее, потому что у нас все еще было бы значительное количество операций чтения для чтения дерева очень большого размера.
Когда сбор данных настолько велик, что он не помещается в памяти, решение представляет собой B-дерево (интересный фактоид: нет единого мнения о том, что на самом деле означает «B»). B-дерево содержит много дочерних узлов и множество указателей на дочерний узел. Таким образом, во время чтения с диска (которое может занять около 10 мс для чтения одного блока диска), возвращается максимальный объем данных соответствующего узла, а также указатели на дисковые блоки «конечного узла». Это позволяет амортизировать время извлечения данных до времени записи (n), что делает B-дерево особенно полезным для реализаций извлечения базы данных и большого набора данных.