BTree - заранее определенный размер? - PullRequest
0 голосов
/ 15 октября 2011

Я читал это в Википедии:

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

Мы должны указать этот диапазон для B деревьев. Даже когда я посмотрел CLRS (Intro to Algorithms), он, похоже, использовал массивы для ключей и дочерних элементов. Мой вопрос - есть ли способ уменьшить эту потерю в пространстве, определяя ключи и дочерние элементы как списки вместо предопределенных массивов? Это слишком много хлопот?

Кроме того, я не могу получить приличный psedocode на btreeDeleteNode. Любая помощь здесь приветствуется.

Ответы [ 2 ]

2 голосов
/ 15 октября 2011

Когда вы говорите «списки», вы имеете в виду связанные списки?

Массив некоторого вида элемента занимает память одного элемента на слот, независимо от того, заполнен этот слот или нет. Связанный список занимает только память для элементов, которые он фактически содержит, но для каждого он занимает память одного элемента, плюс размер одного указателя (два, если это список с двойной связью, если только Вы можете использовать трюк XOR, чтобы перекрыть их).

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

Если вы используете язык, у которого во время выполнения есть накладные расходы для каждого объекта (например, Java и C, если вы сами не распределяете память), то вам также придется платить за эти издержки по каждой ссылке в списке, но только один раз в массиве, а соотношение еще хуже.

Я бы предложил, чтобы ваш алгоритм балансировки оставлял узлы дерева как минимум наполовину заполненными. Если вы разделите узел, когда он полон, вы создадите два наполовину полных узла. Затем вам нужно объединить соседние узлы, когда они заполнены менее чем наполовину. Затем вы можете использовать массив, будучи уверенным в том, что он более эффективен, чем связанный список.

Понятия не имею о деталях удаления, извините!

1 голос
/ 05 октября 2012

Узел B-Tree имеет важную характеристику, все ключи в узле отсортированы.При нахождении определенного ключа бинарный поиск используется для поиска правильной позиции.Использование бинарного поиска сохраняет сложность алгоритма поиска в B-Tree O(logn).

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

...