28 # ifndef TPL_RAND_TREE_H 29 # define TPL_RAND_TREE_H 32 # include <gsl/gsl_rng.h> 34 # include <ahFunction.H> 35 # include <tpl_randNode.H> 36 # include <tpl_binTreeOps.H> 38 using namespace Aleph;
70 template <
template <
typename>
class NodeType,
typename Key,
class Compare>
75 using Node = NodeType<Key>;
83 Node * random_insert(Node * root, Node * p) noexcept
85 const long & n =
COUNT(root);
86 const size_t rn = gsl_rng_uniform_int(r, n + 1);
91 if (cmp(
KEY(p),
KEY(root)))
93 result = random_insert(
LLINK(root), p);
94 if (result != Node::NullPtr)
101 else if (cmp(
KEY(root),
KEY(p)))
103 result = random_insert(
RLINK(root), p);
104 if (result != Node::NullPtr)
106 RLINK(root) = result;
112 return Node::NullPtr;
115 Node * random_insert_dup(Node * root, Node * p) noexcept
117 const long & n =
COUNT(root);
118 const size_t rn = gsl_rng_uniform_int(r, n + 1);
122 if (cmp(
KEY(p),
KEY(root)))
123 LLINK(root) = random_insert_dup(
LLINK(root), p);
125 RLINK(root) = random_insert_dup(
RLINK(root), p);
134 void init(
unsigned long seed)
136 r = gsl_rng_alloc (gsl_rng_mt19937);
139 throw std::bad_alloc();
141 gsl_rng_set(r, seed % gsl_rng_max(r));
156 void set_seed(
unsigned long seed) noexcept { gsl_rng_set(r, seed); }
161 : tree_root(Node::NullPtr), r(
nullptr), cmp(__cmp)
174 std::swap(tree_root, tree.tree_root);
175 std::swap(r, tree.r);
176 std::swap(cmp, tree.cmp);
193 assert(p != Node::NullPtr);
194 assert((
LLINK(p) == Node::NullPtr) and (
RLINK(p) == Node::NullPtr));
195 assert(
COUNT(p) == 1);
197 Node * result = random_insert(tree_root, p);
198 if (result == Node::NullPtr)
201 return tree_root = result;
213 assert(p != Node::NullPtr);
214 assert((
LLINK(p) == Node::NullPtr) and (
RLINK(p) == Node::NullPtr));
215 assert(
COUNT(p) == 1);
217 return tree_root = random_insert_dup(tree_root, p);
222 Node * random_join_exclusive(Node * tl, Node * tr) noexcept
224 if (tl == Node::NullPtr)
227 if (tr == Node::NullPtr)
230 const size_t & m =
COUNT(tl);
231 const size_t & n =
COUNT(tr);
232 const size_t rn = 1 + gsl_rng_uniform_int(r, m + n);
236 RLINK(tl) = random_join_exclusive(
RLINK(tl), tr);
242 LLINK(tr) = random_join_exclusive(tl,
LLINK(tr));
247 Node * random_remove(Node *& root,
const Key & key) noexcept
249 if (root == Node::NullPtr)
250 return Node::NullPtr;
253 if (cmp(key,
KEY(root)))
255 ret_val = random_remove(
LLINK(root), key);
256 if (ret_val != Node::NullPtr)
261 else if (cmp(
KEY(root), key))
263 ret_val = random_remove(
RLINK(root), key);
264 if (ret_val != Node::NullPtr)
272 root = random_join_exclusive(
LLINK(root),
RLINK(root));
286 Node *
remove(
const Key & key) noexcept
288 Node * ret_val = random_remove(tree_root, key);
290 return ret_val != Node::NullPtr ? ret_val :
nullptr;
299 Node *
search(
const Key & key)
const noexcept
301 Node * retVal = searchInBinTree<Node, Compare>(tree_root, key, cmp);
302 return retVal == Node::NullPtr ? nullptr : retVal;
319 assert(p != Node::NullPtr);
320 assert(
COUNT(p) == 1);
323 if (result !=
nullptr)
326 tree_root = random_insert(tree_root, p);
338 Node *&
getRoot() noexcept {
return tree_root; }
353 size_t size() const noexcept {
return COUNT(tree_root); }
364 std::pair<long, Node*>
position(
const Key & key) noexcept
366 std::pair<long, Node*> ret_val;
401 std::pair<long, Node*> r(-2,
nullptr);
411 Node * remove_pos(Node *& root,
const size_t pos) noexcept
415 Node * ret_val = root;
416 root = random_join_exclusive(
LLINK(ret_val),
RLINK(ret_val));
422 return remove_pos(
LLINK(root), pos);
438 if (i >=
COUNT(tree_root))
439 throw std::out_of_range(
"infix position out of range");
441 return remove_pos(tree_root, i);
492 Node * random_join(Node * t1, Node * t2, Node *& dup)
494 if (t1 == Node::NullPtr)
497 if (t2 == Node::NullPtr)
500 Node * ret = Node::NullPtr;
501 const size_t & m =
COUNT(t1);
502 const size_t & n =
COUNT(t2);
503 const size_t rn = 1 + gsl_rng_uniform_int(r, m + n);
510 if (ret != Node::NullPtr)
518 dup = random_insert_dup(dup, random_remove(t2,
KEY(t1)));
528 if (ret != Node::NullPtr)
536 dup = random_insert_dup(dup, random_remove(t1,
KEY(t2)));
544 Node * random_join(Node * t1, Node * t2)
546 if (t1 == Node::NullPtr)
549 if (t2 == Node::NullPtr)
552 Node * ret = Node::NullPtr;
553 const size_t & m =
COUNT(t1);
554 const size_t & n =
COUNT(t2);
555 const size_t total = m + n;
556 const size_t rn = 1 + gsl_rng_uniform_int(r, total);
594 tree_root = random_join(tree_root, t.tree_root, dup.tree_root);
595 t.tree_root = Node::NullPtr;
608 tree_root = random_join(tree_root, t.tree_root);
609 t.tree_root = Node::NullPtr;
625 tree_root = random_join_exclusive(tree_root, t.tree_root);
626 t.tree_root = Node::NullPtr;
675 template <
typename Key,
class Compare = Aleph::less<Key>>
713 template <
typename Key,
class Compare = Aleph::less<Key>>
723 # endif // TPL_RAND_TREE_H Definition: tpl_binNodeUtils.H:2445
Compare & key_comp() noexcept
return the comparison criteria
Definition: tpl_rand_tree.H:147
Gen_Rand_Tree(unsigned int seed, Compare __cmp=Compare()) noexcept
Definition: tpl_rand_tree.H:160
Definition: tpl_rand_tree.H:635
void join_exclusive(Gen_Rand_Tree &t) noexcept
Definition: tpl_rand_tree.H:623
Node * insert_root(Node *&root, Node *p, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:1773
auto & COUNT(Node *p) noexcept
Definition: tpl_binNodeXt.H:66
Node * remove_pos(const size_t i) noexcept
Definition: tpl_rand_tree.H:436
gsl_rng * gsl_rng_object() noexcept
Get a pointer to gsl random number generator.
Definition: tpl_rand_tree.H:153
Node * insert_dup(Node *p) noexcept
Definition: tpl_rand_tree.H:211
void split_key_dup_rec_xt(Node *&root, const typename Node::key_type &key, Node *&l, Node *&r, Compare &cmp) noexcept
Definition: tpl_binNodeXt.H:572
void split_key_dup(const Key &key, Gen_Rand_Tree &t1, Gen_Rand_Tree &t2) noexcept
Definition: tpl_rand_tree.H:468
bool split_key(const Key &key, Gen_Rand_Tree &t1, Gen_Rand_Tree &t2) noexcept
Definition: tpl_rand_tree.H:452
Node * search(const Key &key) const noexcept
Definition: tpl_rand_tree.H:299
bool check_rank_tree(Node *root) noexcept
Definition: tpl_binNodeXt.H:896
Definition: tpl_rand_tree.H:676
Node * select(const size_t i) const
Definition: tpl_rand_tree.H:347
Definition: tpl_binTreeOps.H:560
Node::Key_Type & KEY(Node *p) noexcept
Definition: tpl_binNode.H:318
void split_pos_rec(Node *&r, const size_t i, Node *&ts, Node *&tg)
Definition: tpl_binNodeXt.H:710
Node * select(Node *r, const size_t pos)
Definition: tpl_binNodeXt.H:150
std::pair< long, Node * > position(const Key &key) noexcept
Definition: tpl_rand_tree.H:364
Gen_Rand_Tree(Compare cmp=Compare()) noexcept
Definition: tpl_rand_tree.H:168
Node * insert_root_xt(Node *&root, Node *p, Compare &cmp) noexcept
Definition: tpl_binNodeXt.H:605
Node *& getRoot() noexcept
Return the tree's root.
Definition: tpl_rand_tree.H:338
long inorder_position(Node *r, const typename Node::key_type &key, Node *&p, Compare &cmp) noexcept
Definition: tpl_binNodeXt.H:210
Node * insert_dup_root_xt(Node *&root, Node *p, Compare &cmp) noexcept
Definition: tpl_binNodeXt.H:646
Node *& LLINK(Node *p) noexcept
Definition: tpl_binNode.H:298
size_t size() const noexcept
Return the number of nodes that have the tree.
Definition: tpl_rand_tree.H:353
std::pair< long, Node * > find_position(const Key &key) noexcept
Definition: tpl_rand_tree.H:399
void join(Gen_Rand_Tree &t, Gen_Rand_Tree &dup) noexcept
Definition: tpl_rand_tree.H:592
Compare & get_compare() noexcept
Definition: tpl_rand_tree.H:150
Definition: tpl_rand_tree.H:714
Node * insert_dup_root(Node *&root, Node *p, Compare cmp=Compare()) noexcept
Definition: tpl_binNodeUtils.H:1799
bool split_key_rec_xt(Node *&root, const typename Node::key_type &key, Node *&l, Node *&r, Compare &cmp) noexcept
Definition: tpl_binNodeXt.H:512
bool verify() const
Return true if this is a consistent randomized tree.
Definition: tpl_rand_tree.H:332
Node * search_or_insert(Node *p) noexcept
Definition: tpl_rand_tree.H:317
Node * insert(Node *p) noexcept
Definition: tpl_rand_tree.H:191
void join_dup(Gen_Rand_Tree &t) noexcept
Definition: tpl_rand_tree.H:606
void set_seed(unsigned long seed) noexcept
Set the random number generator seed.
Definition: tpl_rand_tree.H:156
Node *& RLINK(Node *p) noexcept
Definition: tpl_binNode.H:307
void split_pos(size_t pos, Gen_Rand_Tree &t1, Gen_Rand_Tree &t2) noexcept
Definition: tpl_rand_tree.H:485
void swap(Gen_Rand_Tree &tree) noexcept
Swap in constant time all the nodes of this with tree
Definition: tpl_rand_tree.H:172
Definition: tpl_rand_tree.H:71