В b-дереве вы можете хранить как ключи, так и данные во внутренних и конечных узлах , но в b + дереве вы должны хранить данные только в конечных узлах .
Есть ли какое-то преимущество в том, что вы делаете в дереве b +?
Почему бы не использовать b-деревья вместо b + деревьев повсюду, поскольку интуитивно они кажутся намного быстрее?
Я имею в виду, зачем вам нужно копировать ключ (данные) в дереве b +?
database
data-structures
simplfuzz
источник
источник
Ответы:
Изображение ниже помогает показать различия между деревьями B + и B.
Преимущества B + деревьев:
Преимущество B деревьев:
источник
Основное преимущество деревьев B + перед деревьями B состоит в том, что они позволяют упаковать больше указателей на другие узлы, удаляя указатели на данные, тем самым увеличивая разветвленность и потенциально уменьшая глубину дерева.
Недостатком является то, что нет ранних выходов, когда вы могли найти совпадение во внутреннем узле. Но поскольку обе структуры данных имеют большие разветвления, подавляющее большинство ваших совпадений будет в любом случае находиться на конечных узлах, что в среднем сделает дерево B + более эффективным.
источник
Деревья B + намного проще и эффективнее выполнять полное сканирование, как при просмотре каждого фрагмента данных, который индексирует дерево, поскольку конечные узлы образуют связанный список. Чтобы выполнить полное сканирование с помощью B-Tree, вам нужно выполнить полный обход дерева, чтобы найти все данные.
B-Trees, с другой стороны, могут работать быстрее, когда вы выполняете поиск (ищите определенный фрагмент данных по ключу), особенно когда дерево находится в ОЗУ или другом неблочном хранилище. Поскольку вы можете поднять часто используемые узлы в дереве, для получения данных требуется меньше сравнений.
источник
источник
Пример из базы данных системной концепции 5
В + -tree
соответствующее B-дерево
источник
Clearview bucket
кMianus Bucket
. В любом случае, не имеет смысла делать это, потому что между ними у вас есть то,Downtown bucket
что нужно искать в случае, если вы хотите выполнить индексное сканирование в B-дереве (требует обратного отслеживания). Где ты это взял?Определите «намного быстрее». Асимптотически они примерно одинаковы. Различия заключаются в том, как они используют вторичное хранилище. Статьи Википедии о B-деревьях и B + деревьях выглядят довольно заслуживающими доверия.
источник
Адегок А, Амит
Я думаю, что один важный момент, которого вы, люди, упускаете, - это разница между данными и указателями, как описано в этом разделе.
Указатель: указатель на другие узлы.
Данные: - В контексте индексов базы данных данные - это просто еще один указатель на реальные данные (строки), которые находятся где-то еще.
Следовательно, в случае дерева B каждый узел имеет три информационных ключа, указатели на данные, связанные с ключами, и указатель на дочерние узлы.
В B + tree внутренний узел хранит ключи и указатели на дочерний узел, в то время как конечный узел хранит ключи и указатели на связанные данные. Это позволяет большее количество ключей для данного размера узла. Размер узла определяется в основном размером блока.
Преимущество наличия большего количества ключей на узел объяснено выше, поэтому я сэкономлю свои усилия при наборе текста.
источник
Деревья B + особенно хороши в блочном хранилище (например, на жестком диске). Имея это в виду, вы получаете несколько преимуществ, например (из головы):
большая разветвленность / низкая глубина: это означает, что вам нужно меньше блоков, чтобы добраться до данных. с данными, смешанными с указателями, каждое чтение получает меньше указателей, поэтому вам нужно больше поисков, чтобы добраться до данных
Простое и согласованное хранение блоков: у внутреннего узла есть N указателей, больше ничего, у конечного узла есть данные, больше ничего. это облегчает анализ, отладку и даже реконструкцию.
высокая плотность ключей означает, что верхние узлы почти наверняка находятся в кеше, во многих случаях все внутренние узлы быстро кэшируются, поэтому только доступ к данным должен идти на диск.
источник
В B + Tree, поскольку во внутренних узлах хранятся только указатели, их размер становится значительно меньше, чем внутренние узлы B-дерева (в которых хранятся и данные + ключ). Следовательно, индексы дерева B + могут быть извлечены из внешнего хранилища за одно чтение диска и обработаны, чтобы найти местоположение цели. Если это было дерево B, чтение диска необходимо для каждого процесса принятия решения. Надеюсь, я ясно изложил свою точку зрения! :)
источник
**
** ref: Структуры данных с использованием C // Автор: Aaro M Tenenbaum
http://books.google.co.in/books?id=X0Cd1Pr2W0gC&pg=PA456&lpg=PA456&dq=drawback+of+B-Tree+is+the+difficulty+of+Traversing+the+keys+sequentially&source=bl&ots=pGcPQSEJMS&sig= F9MY7zEXYAMVKl_Sg4W-0LTRor8 & гл = еп & са = Х & е = nD5AUbeeH4zwrQe12oCYAQ & вед = 0CDsQ6AEwAg # v = OnePage & д = минус% 20of% 20B-дерево% 20is% 20the% 20difficulty% 20of% 20Traversing% 20the% 20keys% 20sequentially & F = ложь
источник
Возьмем один пример - у вас есть таблица с огромными данными в строке. Это означает, что каждый экземпляр объекта Большой.
Если вы используете дерево B здесь, то большую часть времени тратится на сканирование страниц с данными, что бесполезно. В базах данных это является причиной использования B + Trees, чтобы избежать проверки данных объекта.
Деревья B + отделяют ключи от данных.
Но если ваш размер данных меньше, вы можете хранить их с ключом, что и делает B-дерево.
источник
Основное различие между B-деревом и B + деревом состоит в том, что B-дерево исключает избыточное хранение значений ключей поиска. Поскольку ключи поиска не повторяются в B-дереве, мы не сможем сохранить индекс, используя меньшее количество узлов дерева. чем в соответствующем индексе B + дерева. Однако, поскольку ключ поиска, который появляется в неконечных узлах, больше нигде не встречается в B-дереве, мы вынуждены включать дополнительное поле указателя для каждого ключа поиска в неконцевом узле. Они являются космическими преимуществами для B-дерева, поскольку повторение не происходит и может использоваться для больших индексов.
источник
Дерево B + - это сбалансированное дерево, в котором каждый путь от корня дерева до листа имеет одинаковую длину, и каждый нелистовый узел дерева имеет от [n / 2] до [n] дочерних элементов, где n - это исправлено для конкретного дерева. Он содержит индексные страницы и страницы данных. Двоичные деревья имеют только двух дочерних элементов на родительский узел, деревья B + могут иметь переменное число дочерних элементов для каждого родительского узла.
источник
Одно из возможных применений деревьев B + заключается в том, что оно подходит для ситуаций, когда дерево становится настолько большим, что не помещается в доступную память. Таким образом, вы обычно ожидаете выполнения нескольких операций ввода-вывода.
Часто случается, что дерево B + используется, даже когда оно фактически помещается в память, и тогда ваш кэш-менеджер может хранить его там постоянно. Но это особый случай, а не общий, и политика кэширования является отдельной от обслуживания дерева B + как такового.
Кроме того, в дереве B + листовые страницы связаны друг с другом в связанный список (или список с двумя связями), который оптимизирует обходы (для поиска по диапазону, сортировки и т. Д.). Таким образом, количество указателей является функцией конкретного используемого алгоритма.
источник