wip heap insert
ci/woodpecker/pr/lint Pipeline is pending Details
ci/woodpecker/pr/test-mem Pipeline is pending Details
ci/woodpecker/pr/test Pipeline is pending Details

Jef Roosens 2023-01-22 20:34:05 +01:00
parent 16b78b8431
commit dbdc7c9ebe
2 changed files with 93 additions and 22 deletions

View File

@ -4,24 +4,6 @@ vieter_heap_node *vieter_heap_node_init() {
return calloc(1, sizeof(vieter_heap_node)); return calloc(1, sizeof(vieter_heap_node));
} }
vieter_heap_node *vieter_heap_node_merge_same_order(vieter_heap_node *root_a,
vieter_heap_node *root_b) {
vieter_heap_node *new_root, *new_child;
if (root_a->key <= root_b->key) {
new_root = root_a;
new_child = root_b;
} else {
new_root = root_b;
new_child = root_a;
}
new_root->next_largest_order = new_root->largest_order;
new_root->largest_order = new_child;
return new_root;
}
vieter_heap_tree *vieter_heap_tree_init(vieter_heap_node *root, vieter_heap_tree *vieter_heap_tree_init(vieter_heap_node *root,
vieter_heap_tree *next, vieter_heap_tree *next,
uint64_t order) { uint64_t order) {
@ -34,5 +16,93 @@ vieter_heap_tree *vieter_heap_tree_init(vieter_heap_node *root,
return tree; return tree;
} }
vieter_heap_tree *vieter_heap_tree_merge(vieter_heap_tree *tree_a, void vieter_heap_tree_swap(vieter_heap_tree *t1, vieter_heap_tree *t2) {
vieter_heap_tree *tree_b) {} vieter_heap_tree temp = {
.order = t1->order,
.root = t1->root,
.next = t1->next
};
t1->order = t2->order;
t1->root = t2->root;
t1->next = t2->next;
t2->order = temp.order;
t2->root = temp.root;
t2->next = temp.next;
}
vieter_heap_tree *vieter_heap_tree_merge_same_order(vieter_heap_tree *tree_a,
vieter_heap_tree *tree_b) {
vieter_heap_tree *new_tree;
if (tree_a->root->key <= tree_b->root->key) {
new_tree = tree_a;
tree_a->root->next_largest_order = tree_a->root->largest_order;
tree_a->root->largest_order = tree_b->root;
free(tree_b);
} else {
new_tree = tree_b;
tree_b->root->next_largest_order = tree_b->root->largest_order;
tree_b->root->largest_order = tree_a->root;
free(tree_a);
}
new_tree->order++;
return new_tree;
}
vieter_heap_tree *vieter_heap_tree_merge(vieter_heap_tree *tree_a, vieter_heap_tree *tree_b) {
vieter_heap_tree *tree, *target;
if (tree_a->order <= tree_b->order) {
target = tree_a;
tree = tree_b;
} else {
target = tree_b;
tree = tree_a;
}
vieter_heap_tree *next_tree, *next_target;
vieter_heap_tree *previous_target = target;
while (1) {
if (target->order == tree->order) {
next_tree = tree->next;
next_target = target->next;
target = vieter_heap_tree_merge_same_order(target, tree);
// TODO what when this merge produces an order that's already in target
target->next = next_target;
previous_target->next = target;
tree = next_tree;
} else if (target->order > tree->order) {
previous_target->next = tree;
tree->next = target;
tree = tree->next;
} else {
previous_target = target;
target = target->next;
}
}
if (target->order > tree->order) {
vieter_heap_tree_swap(target, tree);
} else if (target->order == tree->order) {
target->root->next_largest_order = target->root->largest_order;
target->root->largest_order = tree->root;
target->order++;
next_tree = tree->next;
free(tree);
tree = next_tree;
}
}

View File

@ -15,8 +15,6 @@ vieter_heap_node *vieter_heap_node_init();
void vieter_heap_node_free(vieter_heap_node *node); void vieter_heap_node_free(vieter_heap_node *node);
vieter_heap_node *vieter_heap_tree_merge_same_order(vieter_heap_node *root_a, vieter_heap_node *root_b);
typedef struct vieter_heap_tree { typedef struct vieter_heap_tree {
uint64_t order; uint64_t order;
vieter_heap_node *root; vieter_heap_node *root;
@ -27,4 +25,7 @@ vieter_heap_tree *vieter_heap_tree_init(vieter_heap_node *root, vieter_heap_tree
vieter_heap_tree *vieter_heap_tree_merge(vieter_heap_tree *tree_a, vieter_heap_tree *tree_b); vieter_heap_tree *vieter_heap_tree_merge(vieter_heap_tree *tree_a, vieter_heap_tree *tree_b);
vieter_heap_tree *vieter_heap_tree_merge_same_order(vieter_heap_tree *tree_a,
vieter_heap_tree *tree_b);
#endif #endif