Предположим, у нас есть следующее b-дерево
Я хотел бы создать алгоритм для нахождения k-го наименьшего элемента.Я пытался реализовать то, что было написано в этой ссылке , но я обнаружил, что ни одно из решений, похоже, не работает для этого вида дерева.
До сих пор я делал это, что работает нормальнодля элементов последней ветви
i <-0
function kthSmallestElement(Node node, int k)
if(branch[i] != NULL) then
size<-branch[i].size();
if(k < size) then
i++;
call the function recursively for new branch[i], k
else if(k > size) then
k-=size
i++;
call the function recursively for new branch[i], k
else if (k==size) then
print branch[i]->entry[k-1]
else
print brach[i-1]->entry[k-1]
end function
Я реализовал алгоритм, используя C
#define MAX 4 /* maximum number of keys in node. */
#define MIN 2 /* minimum number of keys in node */
typedef int Key;
typedef struct {
Key key;
int value; /* values can be arbitrary */
} Treeentry;
typedef enum {FALSE, TRUE} Boolean;
typedef struct treenode Treenode;
struct treenode {
int count; /* denotes how many keys there are in the node */
/*
The entries at each node are kept in an array entry
and the pointers in an array branch
*/
Treeentry entry[MAX+1];
Treenode *branch[MAX+1];
};
int i = 0;
int size = 0;
void FindKthSmallestElement(Treenode *rootNode, int k){
if(branch[i] != NULL) //since the node has a child
size = branch[i] ->count;
if(k < size){
i++;
FindKthSmallestElement(branch[i], k);
}else if(k > size){
k-=size;
i++;
FindKthSmallestElement(branch[i], k);
}else if (k==size)
printf ("%d", branch[i]->entry[k-1].key);
else
printf ("%d", brach[i-1]->entry[k-1].key);
}
Не могли бы вы предложить, что я должен исправить в этом, чтобы иметь действительный вывод длякаждый kth самый маленький элемент?Я склонен полагать, что эта проблема не может быть решена рекурсивно, так как у нас есть более одной записи в каждом узле.Было бы разумно сделать это деревом кучи, как в этой ссылке ?