Pixie
Loading...
Searching...
No Matches
louds_tree.h
1#pragma once
2
3#include <pixie/bitvector.h>
4
5#include <cstdint>
6#include <span>
7
8namespace pixie {
9
13struct LoudsNode {
14 size_t number;
15 size_t pos;
16
17 LoudsNode(size_t node_number, size_t louds_pos)
18 : number(node_number), pos(louds_pos) {}
19};
20
25class LoudsTree {
26 private:
27 BitVector bv;
28
29 public:
33 explicit LoudsTree(std::span<const uint64_t> louds, size_t tree_size)
34 : bv(louds, 2 * tree_size - 1) {}
35
39 LoudsNode root() const { return LoudsNode(0, 0); }
40
44 size_t size() const { return (bv.size() + 1) / 2; }
45
49 bool is_leaf(const LoudsNode& node) const {
50 return (node.pos + 1 == bv.size()) or bv[node.pos + 1];
51 }
52
56 bool is_root(const LoudsNode& node) const { return node.number == 0; }
57
61 size_t degree(const LoudsNode& node) const {
62 if (is_leaf(node)) {
63 return 0;
64 }
65 return bv.select(node.number + 2) - node.pos - 1;
66 }
67
72 LoudsNode child(const LoudsNode& node, size_t i) const {
73 size_t zeros = node.pos + i + 1 - node.number;
74 return LoudsNode(zeros, bv.select(zeros + 1));
75 }
76
80 LoudsNode first_child(const LoudsNode& node) const {
81 size_t zeros = node.pos + 1 - node.number;
82 return LoudsNode(zeros, bv.select(zeros + 1));
83 }
84
89 LoudsNode parent(const LoudsNode& node) const {
90 if (node.number == 0) {
91 return root();
92 }
93 size_t zero_pos = bv.select0(node.number);
94 size_t parent_number = zero_pos - node.number;
95 return LoudsNode(parent_number, bv.select(parent_number + 1));
96 }
97
101 bool is_last_child(const LoudsNode& node) const {
102 size_t zero_pos = bv.select0(node.number);
103 return bv[zero_pos + 1];
104 }
105
109 LoudsNode next_sibling(const LoudsNode& node) const {
110 size_t sibling_number = node.number + 1;
111 return LoudsNode(sibling_number, bv.select(sibling_number + 1));
112 }
113};
114
115} // namespace pixie
Non-interleaved, non-owning bit vector with rank and select.
Definition bitvector.h:63
bool is_last_child(const LoudsNode &node) const
Indicates if node is last child.
Definition louds_tree.h:101
bool is_root(const LoudsNode &node) const
Indicates if node is a root.
Definition louds_tree.h:56
LoudsTree(std::span< const uint64_t > louds, size_t tree_size)
Constructor from an external array of uint64_t.
Definition louds_tree.h:33
LoudsNode child(const LoudsNode &node, size_t i) const
Returns the i-th child of node Indexing starts at 0.
Definition louds_tree.h:72
size_t size() const
Returns the size of the tree.
Definition louds_tree.h:44
LoudsNode root() const
Returns the root node.
Definition louds_tree.h:39
bool is_leaf(const LoudsNode &node) const
Indicates if node is a leaf.
Definition louds_tree.h:49
LoudsNode first_child(const LoudsNode &node) const
Returns first child of a node.
Definition louds_tree.h:80
LoudsNode next_sibling(const LoudsNode &node) const
Returns next sibling of a node.
Definition louds_tree.h:109
size_t degree(const LoudsNode &node) const
Returns the number of children of a node.
Definition louds_tree.h:61
LoudsNode parent(const LoudsNode &node) const
Returns the parent of a node if node is not root, else returns root.
Definition louds_tree.h:89
A node class of LOUDS tree.
Definition louds_tree.h:13