most/least significant element tests/accessors
This commit is contained in:
parent
b190719970
commit
482f01ed5e
123
src/main.zig
123
src/main.zig
|
@ -237,6 +237,70 @@ const BTree = struct {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn find_most_significant_key(self: NodeOrLeaf) Leaf.SearchResult {
|
||||||
|
var node = self;
|
||||||
|
while (true) {
|
||||||
|
switch (node.force()) {
|
||||||
|
.internal => |internal| {
|
||||||
|
if (internal.get_edges()[internal.leaf.len]) |child| {
|
||||||
|
node = child;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
.leaf => |leaf| {
|
||||||
|
return .{ .Leaf = .{ .leaf = leaf, .idx = leaf.len - 1 } };
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn find_least_significant_key(self: NodeOrLeaf) Leaf.SearchResult {
|
||||||
|
var node = self;
|
||||||
|
while (true) {
|
||||||
|
switch (node.force()) {
|
||||||
|
.internal => |internal| {
|
||||||
|
if (internal.get_edges()[0]) |child| {
|
||||||
|
node = child;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
.leaf => |leaf| {
|
||||||
|
return .{ .Leaf = .{ .leaf = leaf, .idx = 0 } };
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_most_significant_value(self: NodeOrLeaf) u32 {
|
||||||
|
switch (self.force()) {
|
||||||
|
.internal => |node| {
|
||||||
|
if (node.get_edges()[node.leaf.len]) |edge| {
|
||||||
|
return edge.get_most_significant_value();
|
||||||
|
} else {
|
||||||
|
return node.as_leaf().get_values()[node.leaf.len - 1];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
.leaf => |node| {
|
||||||
|
return node.get_values()[node.len - 1];
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_least_significant_value(self: NodeOrLeaf) u32 {
|
||||||
|
switch (self.force()) {
|
||||||
|
.internal => |node| {
|
||||||
|
if (node.get_edges()[0]) |edge| {
|
||||||
|
return edge.get_least_significant_value();
|
||||||
|
} else {
|
||||||
|
return node.as_leaf().get_values()[0];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
.leaf => |node| {
|
||||||
|
return node.get_values()[0];
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn dbg(self: NodeOrLeaf) void {
|
fn dbg(self: NodeOrLeaf) void {
|
||||||
switch (self) {
|
switch (self) {
|
||||||
.internal => |node| {
|
.internal => |node| {
|
||||||
|
@ -343,6 +407,12 @@ const BTree = struct {
|
||||||
const edges = self.get_edges()[0..values.len];
|
const edges = self.get_edges()[0..values.len];
|
||||||
std.debug.print("{{ ", .{});
|
std.debug.print("{{ ", .{});
|
||||||
std.debug.print("[{}] ", .{self.leaf.level});
|
std.debug.print("[{}] ", .{self.leaf.level});
|
||||||
|
|
||||||
|
// an internal node should have at least B elements
|
||||||
|
if (self.leaf.len < MIN_AFTER_SPLIT) {
|
||||||
|
std.debug.print("[E] ", .{});
|
||||||
|
}
|
||||||
|
|
||||||
for (values, edges) |v, e| {
|
for (values, edges) |v, e| {
|
||||||
if (e) |edge| {
|
if (e) |edge| {
|
||||||
edge.dbg();
|
edge.dbg();
|
||||||
|
@ -458,6 +528,11 @@ const BTree = struct {
|
||||||
Leaf: struct { leaf: *Leaf, idx: u16 },
|
Leaf: struct { leaf: *Leaf, idx: u16 },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
fn remove_key(self: *Leaf, key: u32) void {
|
||||||
|
_ = self;
|
||||||
|
_ = key;
|
||||||
|
}
|
||||||
|
|
||||||
fn find_key(self: *Leaf, key: u32) SearchResult {
|
fn find_key(self: *Leaf, key: u32) SearchResult {
|
||||||
for (self.get_values(), 0..) |v, i| {
|
for (self.get_values(), 0..) |v, i| {
|
||||||
if (key < v) {
|
if (key < v) {
|
||||||
|
@ -516,17 +591,6 @@ pub fn main() !void {
|
||||||
try bw.flush(); // don't forget to flush!
|
try bw.flush(); // don't forget to flush!
|
||||||
}
|
}
|
||||||
|
|
||||||
test "btree leaf" {
|
|
||||||
std.testing.refAllDeclsRecursive(BTree);
|
|
||||||
std.testing.refAllDeclsRecursive(BTree.Leaf);
|
|
||||||
|
|
||||||
var leaf = BTree.Leaf{ .ally = std.testing.allocator, .parent = null, .len = 2, .values = [_]u32{ 5, 6, undefined, undefined, undefined } };
|
|
||||||
const values = leaf.get_values();
|
|
||||||
|
|
||||||
std.debug.print("{?}\n", .{leaf});
|
|
||||||
std.debug.print("{any}\n", .{values});
|
|
||||||
}
|
|
||||||
|
|
||||||
fn printValues(leaf: *BTree.Leaf) void {
|
fn printValues(leaf: *BTree.Leaf) void {
|
||||||
const values = leaf.get_values();
|
const values = leaf.get_values();
|
||||||
std.debug.print("{any}\n", .{values});
|
std.debug.print("{any}\n", .{values});
|
||||||
|
@ -608,3 +672,40 @@ test "btree rand insert" {
|
||||||
|
|
||||||
tree.dbg();
|
tree.dbg();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
test "btree least most sig value" {
|
||||||
|
std.debug.print("least/most significant values\n", .{});
|
||||||
|
|
||||||
|
var tree = BTree.create(std.testing.allocator);
|
||||||
|
defer tree.destroy();
|
||||||
|
|
||||||
|
for (0..100) |i| {
|
||||||
|
tree.insert(@intCast(u32, i)) catch {
|
||||||
|
std.debug.print("{} already present - ignoring\n", .{i});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
tree.dbg();
|
||||||
|
std.debug.print("\n", .{});
|
||||||
|
|
||||||
|
{
|
||||||
|
const l = tree.root.?.get_least_significant_value();
|
||||||
|
const r = tree.root.?.get_most_significant_value();
|
||||||
|
std.debug.print("{} < {}\n", .{ l, r });
|
||||||
|
std.debug.assert(l == 0);
|
||||||
|
std.debug.assert(r == 99);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const node = tree.root.?;
|
||||||
|
const l = node.find_least_significant_key();
|
||||||
|
const r = node.find_most_significant_key();
|
||||||
|
std.debug.print("{} < {}\n", .{ l, r });
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const node = tree.root.?.internal.edges[1].?.force();
|
||||||
|
const l = node.get_least_significant_value();
|
||||||
|
const r = node.get_most_significant_value();
|
||||||
|
std.debug.print("{} < {}\n", .{ l, r });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue