DAS  3.0
Das Analysis System
SearchTree< T >
+ Collaboration diagram for SearchTree< T >:

Classes

class  circulator
 
class  const_circulator
 
class  Node
 

Public Member Functions

 SearchTree (const std::vector< T > &init)
 
 SearchTree (const std::vector< T > &init, unsigned int max_size)
 
void remove (unsigned node_index)
 
void remove (typename SearchTree::Node *node)
 
void remove (typename SearchTree::circulator &circ)
 
circulator insert (const T &value)
 
const Nodeoperator[] (int i) const
 
unsigned int size () const
 
void verify_structure ()
 
void verify_structure_linear () const
 
void verify_structure_recursive (const Node *, const Node *, const Node *) const
 
void print_elements ()
 
unsigned int max_depth () const
 
int loc (const Node *node) const
 
Node_find_predecessor (const Node *)
 
Node_find_successor (const Node *)
 
const Nodeoperator[] (unsigned int i) const
 
const_circulator somewhere () const
 
circulator somewhere ()
 

Private Member Functions

void _initialize (const std::vector< T > &init)
 
void _do_initial_connections (unsigned int this_one, unsigned int scale, unsigned int left_edge, unsigned int right_edge, unsigned int depth)
 

Private Attributes

std::vector< Node_nodes
 
std::vector< Node * > _available_nodes
 
Node_top_node
 
unsigned int _n_removes
 

Constructor & Destructor Documentation

◆ SearchTree() [1/2]

SearchTree ( const std::vector< T > &  init)
367  :
368  _nodes(init.size()), _available_nodes(0) {
369  _available_nodes.reserve(init.size());
370  _initialize(init);
371 }

◆ SearchTree() [2/2]

SearchTree ( const std::vector< T > &  init,
unsigned int  max_size 
)
358  :
359  _nodes(max_size) {
360  _available_nodes.reserve(max_size);
361  _available_nodes.resize(max_size - init.size());
362  for (unsigned int i = init.size(); i < max_size; i++) {
363  _available_nodes[i-init.size()] = &(_nodes[i]);
364  }
365  _initialize(init);
366 }

Member Function Documentation

◆ _do_initial_connections()

void _do_initial_connections ( unsigned int  this_one,
unsigned int  scale,
unsigned int  left_edge,
unsigned int  right_edge,
unsigned int  depth 
)
private
404  {
405 #ifdef __FJCORE_SEARCHTREE_TRACK_DEPTH
406  _max_depth = max(depth, _max_depth);
407 #endif
408  unsigned int ref_new_scale = (scale+1)/2;
409  unsigned new_scale = ref_new_scale;
410  bool did_child = false;
411  while(true) {
412  int left = this_one - new_scale; // be careful here to use signed int...
413  if (left >= static_cast<int>(left_edge)
414  && _nodes[left].treelinks_null() ) {
415  _nodes[left].parent = &(_nodes[this_one]);
416  _nodes[this_one].left = &(_nodes[left]);
417  _do_initial_connections(left, new_scale, left_edge, this_one, depth+1);
418  did_child = true;
419  break;
420  }
421  unsigned int old_new_scale = new_scale;
422  new_scale = (old_new_scale + 1)/2;
423  if (new_scale == old_new_scale) break;
424  }
425  if (!did_child) {_nodes[this_one].left = NULL;}
426  new_scale = ref_new_scale;
427  did_child = false;
428  while(true) {
429  unsigned int right = this_one + new_scale;
430  if (right < right_edge && _nodes[right].treelinks_null()) {
431  _nodes[right].parent = &(_nodes[this_one]);
432  _nodes[this_one].right = &(_nodes[right]);
433  _do_initial_connections(right, new_scale, this_one+1,right_edge,depth+1);
434  did_child = true;
435  break;
436  }
437  unsigned int old_new_scale = new_scale;
438  new_scale = (old_new_scale + 1)/2;
439  if (new_scale == old_new_scale) break;
440  }
441  if (!did_child) {_nodes[this_one].right = NULL;}
442 }

◆ _find_predecessor()

SearchTree< T >::Node * _find_predecessor ( const Node )
590  {
591  typename SearchTree<T>::Node * newnode;
592  if (node->left != NULL) {
593  newnode = node->left;
594  while(newnode->right != NULL) {newnode = newnode->right;}
595  return newnode;
596  } else {
597  const typename SearchTree<T>::Node * lastnode = node;
598  newnode = node->parent;
599  while(newnode != NULL) {
600  if (newnode->right == lastnode) {return newnode;}
601  lastnode = newnode;
602  newnode = newnode->parent;
603  }
604  return newnode;
605  }
606 }

◆ _find_successor()

SearchTree< T >::Node * _find_successor ( const Node )
607  {
608  typename SearchTree<T>::Node * newnode;
609  if (node->right != NULL) {
610  newnode = node->right;
611  while(newnode->left != NULL) {newnode = newnode->left;}
612  return newnode;
613  } else {
614  const typename SearchTree<T>::Node * lastnode = node;
615  newnode = node->parent;
616  while(newnode != NULL) {
617  if (newnode->left == lastnode) {return newnode;}
618  lastnode = newnode;
619  newnode = newnode->parent;
620  }
621  return newnode;
622  }
623 }

◆ _initialize()

void _initialize ( const std::vector< T > &  init)
private
372  {
373  _n_removes = 0;
374  unsigned n = init.size();
375  assert(n>=1);
376 #ifdef __FJCORE_SEARCHTREE_TRACK_DEPTH
377  _max_depth = 0;
378 #endif
379  for (unsigned int i = 1; i<n; i++) {
380  assert(!(init[i] < init[i-1]));
381  }
382  for(unsigned int i = 0; i < n; i++) {
383  _nodes[i].value = init[i];
384  _nodes[i].predecessor = (& (_nodes[i])) - 1;
385  _nodes[i].successor = (& (_nodes[i])) + 1;
386  _nodes[i].nullify_treelinks();
387  }
388  _nodes[0].predecessor = (& (_nodes[n-1]));
389  _nodes[n-1].successor = (& (_nodes[0]));
390  unsigned int scale = (n+1)/2;
391  unsigned int top = std::min(n-1,scale);
392  _nodes[top].parent = NULL;
393  _top_node = &(_nodes[top]);
394  _do_initial_connections(top, scale, 0, n, 0);
395 }

◆ insert()

SearchTree< T >::circulator insert ( const T &  value)
501  {
502  assert(_available_nodes.size() > 0);
503  Node * node = _available_nodes.back();
504  _available_nodes.pop_back();
505  node->value = value;
506  Node * location = _top_node;
507  Node * old_location = NULL;
508  bool on_left = true; // (init not needed -- but soothes g++4)
509 #ifdef __FJCORE_SEARCHTREE_TRACK_DEPTH
510  unsigned int depth = 0;
511 #endif
512  while(location != NULL) {
513 #ifdef __FJCORE_SEARCHTREE_TRACK_DEPTH
514  depth++;
515 #endif
516  old_location = location;
517  on_left = value < location->value;
518  if (on_left) {location = location->left;}
519  else {location = location->right;}
520  }
521 #ifdef __FJCORE_SEARCHTREE_TRACK_DEPTH
522  _max_depth = max(depth, _max_depth);
523 #endif
524  node->parent = old_location;
525  if (on_left) {node->parent->left = node;}
526  else {node->parent->right = node;}
527  node->left = NULL;
528  node->right = NULL;
529  node->predecessor = _find_predecessor(node);
530  if (node->predecessor != NULL) {
531  node->successor = node->predecessor->successor;
532  node->predecessor->successor = node;
533  node->successor->predecessor = node;
534  } else {
535  node->successor = _find_successor(node);
536  assert(node->successor != NULL); // can only happen if we're sole element
537  node->predecessor = node->successor->predecessor;
538  node->successor->predecessor = node;
539  node->predecessor->successor = node;
540  }
541  return circulator(node);
542 }

◆ loc()

int loc ( const Node node) const
inline
396  {return node == NULL?
397  -999 : node - &(_nodes[0]);}

◆ max_depth()

unsigned int max_depth ( ) const
inline
250 {return 0;};

◆ operator[]() [1/2]

const Node& operator[] ( int  i) const
inline
241 {return _nodes[i];};

◆ operator[]() [2/2]

const Node& operator[] ( unsigned int  i) const
inline
255 {return _nodes[i];};

◆ print_elements()

void print_elements
624  {
625  typename SearchTree<T>::Node * base_node = &(_nodes[0]);
626  typename SearchTree<T>::Node * node = base_node;
627  int n = _nodes.size();
628  for(; node - base_node < n ; node++) {
629  printf("%4d parent:%4d left:%4d right:%4d pred:%4d succ:%4d value:%10.6f\n",loc(node), loc(node->parent), loc(node->left), loc(node->right), loc(node->predecessor),loc(node->successor),node->value);
630  }
631 }

◆ remove() [1/3]

void remove ( typename SearchTree< T >::circulator circ)
446  {
447  remove(circ._node);
448 }

◆ remove() [2/3]

void remove ( typename SearchTree< T >::Node node)

◆ remove() [3/3]

void remove ( unsigned  node_index)

◆ size()

unsigned int size ( ) const
inline
242 {return _nodes.size() - _available_nodes.size();}

◆ somewhere() [1/2]

SearchTree< T >::circulator somewhere
632  {
633  return circulator(_top_node);
634 }

◆ somewhere() [2/2]

SearchTree< T >::const_circulator somewhere
635  {
636  return const_circulator(_top_node);
637 }

◆ verify_structure()

void verify_structure
543  {
545  const Node * left_limit = _top_node;
546  while (left_limit->left != NULL) {left_limit = left_limit->left;}
547  const Node * right_limit = _top_node;
548  while (right_limit->right != NULL) {right_limit = right_limit->right;}
549  verify_structure_recursive(_top_node, left_limit, right_limit);
550 }

◆ verify_structure_linear()

void verify_structure_linear
570  {
571  unsigned n_top = 0;
572  unsigned n_null = 0;
573  for(unsigned i = 0; i < _nodes.size(); i++) {
574  const typename SearchTree<T>::Node * node = &(_nodes[i]);
575  if (node->treelinks_null()) {n_null++; continue;}
576  if (node->parent == NULL) {
577  n_top++;
578  } else {
579  assert((node->parent->left == node) ^ (node->parent->right == node));
580  }
581  if (node->left != NULL) {
582  assert(!(node->value < node->left->value ));}
583  if (node->right != NULL) {
584  assert(!(node->right->value < node->value ));}
585  }
586  assert(n_top == 1 || (n_top == 0 && size() <= 1) );
587  assert(n_null == _available_nodes.size() ||
588  (n_null == _available_nodes.size() + 1 && size() == 1));
589 }

◆ verify_structure_recursive()

void verify_structure_recursive ( const Node ,
const Node ,
const Node  
) const
554  {
555  assert(!(element->value < left_limit->value));
556  assert(!(right_limit->value < element->value));
557  const Node * left = element->left;
558  if (left != NULL) {
559  assert(!(element->value < left->value));
560  if (left != left_limit) {
561  verify_structure_recursive(left, left_limit, element);}
562  }
563  const Node * right = element->right;
564  if (right != NULL) {
565  assert(!(right->value < element->value));
566  if (right != right_limit) {
567  verify_structure_recursive(right, element, right_limit);}
568  }
569 }

Member Data Documentation

◆ _available_nodes

std::vector<Node *> _available_nodes
private

◆ _n_removes

unsigned int _n_removes
private

◆ _nodes

std::vector<Node> _nodes
private

◆ _top_node

Node* _top_node
private

The documentation for this class was generated from the following file:
SearchTree::loc
int loc(const Node *node) const
Definition: fjcore.cc:396
SearchTree::_available_nodes
std::vector< Node * > _available_nodes
Definition: fjcore.cc:261
SearchTree::Node::left
Node * left
Definition: fjcore.cc:283
SearchTree::Node::parent
Node * parent
Definition: fjcore.cc:285
SearchTree::_initialize
void _initialize(const std::vector< T > &init)
Definition: fjcore.cc:372
SearchTree::_nodes
std::vector< Node > _nodes
Definition: fjcore.cc:260
SearchTree::_top_node
Node * _top_node
Definition: fjcore.cc:262
SearchTree::Node
Definition: fjcore.cc:271
SearchTree::_find_successor
Node * _find_successor(const Node *)
Definition: fjcore.cc:607
SearchTree::Node::successor
Node * successor
Definition: fjcore.cc:286
SearchTree::_find_predecessor
Node * _find_predecessor(const Node *)
Definition: fjcore.cc:590
SearchTree::size
unsigned int size() const
Definition: fjcore.cc:242
SearchTree::Node::treelinks_null
bool treelinks_null() const
default constructor
Definition: fjcore.cc:274
SearchTree::_do_initial_connections
void _do_initial_connections(unsigned int this_one, unsigned int scale, unsigned int left_edge, unsigned int right_edge, unsigned int depth)
Definition: fjcore.cc:398
SearchTree::verify_structure_linear
void verify_structure_linear() const
Definition: fjcore.cc:570
SearchTree::verify_structure_recursive
void verify_structure_recursive(const Node *, const Node *, const Node *) const
Definition: fjcore.cc:551
SearchTree::Node::value
T value
Definition: fjcore.cc:282
SearchTree::remove
void remove(unsigned node_index)
SearchTree::Node::predecessor
Node * predecessor
Definition: fjcore.cc:287
SearchTree::Node::right
Node * right
Definition: fjcore.cc:284
SearchTree::_n_removes
unsigned int _n_removes
Definition: fjcore.cc:263