Track the size of kd-tree nodes

This commit is contained in:
Nikita Lisitsa 2025-05-14 22:55:17 +03:00
parent 132a521b6a
commit 2f75df3c91

View file

@ -111,6 +111,7 @@ namespace psemek::cg
{
value_type value;
node_id children[2] {null, null};
std::uint32_t size = 0;
};
std::vector<node> nodes_;
@ -179,6 +180,7 @@ namespace psemek::cg
auto result = static_cast<node_id>(nodes_.size());
auto & node = nodes_.emplace_back();
node.value = std::move(*middle);
node.size = (end - begin);
nodes_[result].children[0] = build_node_impl(begin, middle, next_axis(split_axis));
nodes_[result].children[1] = build_node_impl(std::next(middle), end, next_axis(split_axis));
@ -193,6 +195,7 @@ namespace psemek::cg
{
auto & node = nodes_.emplace_back();
node.value = std::move(value);
node.size = 1;
return true;
}
@ -212,10 +215,18 @@ namespace psemek::cg
auto & child_node = nodes_.emplace_back();
child_node.value = std::move(value);
child_node.size = 1;
nodes_[id].size += 1;
return true;
}
return insert_impl(std::move(value), node.children[child], next_axis(split_axis));
if (insert_impl(std::move(value), node.children[child], next_axis(split_axis)))
{
nodes_[id].size += 1;
return true;
}
return false;
}
template <typename T, std::size_t N, typename Data>