Методы разделения узлов B-дерева

#c #c #algorithm #data-structures #b-tree

#c #c #алгоритм #структуры данных #b-дерево

Вопрос:

Я наткнулся на проблему, выполняя домашнее задание по DSA (структуры данных и алгоритмы). Говорят, что я реализую B-дерево с алгоритмами вставки и поиска. Насколько я понимаю, поиск работает корректно, но у меня возникли проблемы с реализацией функции вставки. В частности, логика алгоритма разделения узлов B-дерева. Псевдокод / C-стиль, который я мог бы придумать, заключается в следующем:

     #define D 2
    #define DD 2*D

    typedef btreenode* btree;
    typedef struct node
    {
        int keys[DD];  //D == 2 and DD == 2*D;
        btree pointers[DD 1];
        int index; //used to iterate throught the "keys" array
    }btreenode;

    void splitNode(btree* parent, btree* child1, btree* child2)
    {
        //Copies the content from the splitted node to the children
        (*child1)->key[0] = (*parent)->key[0];
        (*child1)->key[1] = (*parent)->key[1];
        (*child2)->key[0] = (*parent)->key[2];
        (*child2)->key[1] = (*parent)->key[3];
        (*child1)->index = 1;
        (*child2)->index = 1;
        //"Clears" the parent node from any data
        for(int i = 0; i<DD; i  ) (*parent)->key[i] = -1;
        for(int i = 0; i<DD 1; i  ) (*parent)->pointers[i] = NULL
        //Fixed the pointers to the children
        (*parent)->index = 0;
        //the line bellow was taken out for creating a new node  that didn't have to be there.
        //(*parent)->key[(*parent)->index] = newNode(); // The newNode() function allocs and inserts a the new key that I need to insert.
        (*parent)->pointers[index] = (*child1);
        (*parent)->pointers[index 1] = (*child2);
    }
 

Я почти уверен, что я что-то напутал с указателями, но я не уверен, что именно. Любая помощь приветствуется. Может быть, мне нужно немного больше изучить тему B-дерева? Я должен добавить, что, хотя я могу использовать базовый ввод / вывод с C , мне нужно использовать структуры в стиле C.

Комментарии:

1. Разрешено ли вам использовать классы?

2. @Кейси — взгляни на последнюю строчку: I must add that while I can use basic input/output from C , I need to use C-style structs.

3. Технически да, но я почти ничего не знаю об ООП. Я имею в виду, я могу читать код и понимать, но мне почему-то не хватает знаний, чтобы писать ООП-код. Если у вас есть решение, использующее классы, я буду рад его прочитать.

4. @haneefmubarak Все в порядке, но спасибо, что заметили!

Ответ №1:

Здесь вам не нужно создавать новый узел. Очевидно, вы уже создали два новых дочерних узла. Все, что вам нужно сделать здесь после заполнения дочерних элементов, это заставить родительский элемент указывать на двух дочерних элементов через копию первого ключа в каждом из них и настроить его количество ключей на два. Вам также не нужно устанавливать родительские ключи равными -1.

Комментарии:

1. Не могли бы вы более четко изложить часть «заставить родительский элемент теперь указывать на двух дочерних элементов через копию первого ключа в каждом из них»? Отмечено о создании узла

2. Вы уже выполнили половину этого, в последних двух строках, но вам нужно настроить соответствующие ключи.

3. Вы имеете в виду настроить количество ключей? Я думаю, что я скорректировал ключи в первых 4 строках

4. Вы установили дочерние ключи в первых нескольких строках, но вы заблокировали родительские ключи вместо того, чтобы устанавливать для них первый ключ child1 и первый ключ child2, или что бы вы ни делали: это зависит от того, строите ли вы B-дерево или B -дерево.

5. Извините, я не являюсь носителем английского языка, и переводчик Google не очень помог мне с «запутанной» частью, хахахаха. Не могли бы вы объяснить это для меня?