Преимущество деревьев B+ над BSTs?

Я узнаю о B + деревьях в классе о базах данных, и мне было интересно, какие конкретные преимущества B+ деревья дадут над бинарными деревьями поиска?

похоже, что они оба имеют среднюю сложность O(logN) для большинства операций примечания, но деревья B+ также имеют дополнительную (незначительную?) время поиска на каждом дочернем узле, где BSTs, очевидно, занимает только O (1) время, чтобы выяснить, к какому дочернему узлу перейти.

какие реальные преимущества делают деревья B+ больше популярный в базах данных, чем BSTs?

2 ответов


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

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

типичный случай использования для B+-дерева или B-дерева находится в базе данных, где есть огромное количество информации, и данные настолько многочисленны, что они не могут все поместиться в основную память. Соответственно, данные могут быть сохранены в B+-дереве или B-дереве на жестком диске где-то. Это минимизирует количество считываний диска, необходимых для извлечения данных во время поиска. Некоторые файловые системы (например, ext4, я считаю) также используют B-деревья по той же причине - они минимизируют количество необходимых поисков диска, что является реальным узким местом.

надеюсь, что это помогает!


для реального хранения данных (например, в БД) требуется много данных для хранения. Поскольку извлечение данных является основной операцией, вызывающей озабоченность, чтение данных с диска занимает больше времени, чем ОЗУ.

теперь, это уловка...

BST хранит меньшие данные в узле по сравнению с деревьями B+. Это приводит к увеличению высоты BST, чем деревья B+. Таким образом, они хранятся на диске, а не в ОЗУ.

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