Преимущество деревьев 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+ - деревья, потому что нет необходимости загрузки данных с диска в ОЗУ).