seg_tree.h
Upload User: gzelex
Upload Date: 2007-01-07
Package Size: 707k
Code Size: 9k
Development Platform:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  seg_tree.h
  6. +
  7. +  Copyright (c) 1995  by  Max-Planck-Institut fuer Informatik
  8. +  Im Stadtwald, 66123 Saarbruecken, Germany     
  9. +  All rights reserved.
  10. *******************************************************************************/
  11. #ifndef LEDA_SEGMENT_TREE_H
  12. #define LEDA_SEGMENT_TREE_H
  13. // ------------------------------------------------------------------
  14. //
  15. // full dynamic Segment Trees
  16. //
  17. // Michael Wenzel     (1990)
  18. //
  19. // Implementation follows
  20. // Kurt Mehlhorn: Data Structures and Algorithms, Vol. 3
  21. //
  22. // ------------------------------------------------------------------
  23. #include <LEDA/impl/bb1_tree.h>
  24. #include <LEDA/list.h>
  25. // ------------------------------------------------------------------
  26. // declarations and definitions 
  27. // ----------------------------------------------------------------- 
  28. class h_segment;
  29. typedef h_segment* h_segment_p;
  30. class seg_node_tree;
  31. typedef seg_node_tree* seg_node_list;
  32. typedef bb1_node* seg_tree_item;
  33. typedef list<seg_tree_item> list_seg_tree_item_;
  34. //------------------------------------------------------------------
  35. // class h_segment
  36. //------------------------------------------------------------------
  37. class h_segment {
  38.   GenPtr _x0;
  39.   GenPtr _x1;
  40.   GenPtr _y;
  41.   GenPtr _inf;
  42.  public:
  43.  GenPtr& x0()    { return _x0;   }
  44.  GenPtr& x1()    { return _x1;   }
  45.  GenPtr& y()     { return _y;    }
  46.  GenPtr& info()  { return _inf;  }
  47.  h_segment()
  48.    _x0 = _x1 = _y = _inf = 0;
  49.  }
  50.  h_segment(GenPtr x0, GenPtr x1, GenPtr y, GenPtr i=0)
  51.    _x0  = x0;
  52.    _x1  = x1;
  53.    _y   = y;
  54.    _inf = i;
  55.  }
  56.  LEDA_MEMORY(h_segment)
  57.  friend ostream& operator<<(ostream&, h_segment&);
  58.  friend class Segment_Tree;
  59.  friend class seg_node_tree;
  60. };
  61. /*------------------------------------------------------------------
  62.    class seg_node_tree = Dictionary(seg_tree_item , void* )
  63. -------------------------------------------------------------------*/
  64. class seg_node_tree : public bb1_tree {
  65. public:
  66. Segment_Tree* father;
  67. int cmp(GenPtr x, GenPtr y) const;
  68. list<seg_tree_item> query(GenPtr, GenPtr);
  69. list<seg_tree_item> all_items();
  70. int            defined(h_segment_p y)    { return bb1_tree::member(Convert(y)); }
  71. seg_tree_item  lookup(h_segment_p y)     { return bb1_tree::lookup(Convert(y)); }
  72. seg_tree_item  locate(h_segment_p y)     { return bb1_tree::locate(Convert(y)); }
  73. seg_tree_item  ord(int y)                { return bb1_tree::ord(int(y)); }
  74. seg_tree_item  insert(h_segment_p y, GenPtr i=0 )
  75.                                  { return bb1_tree::insert(Convert(y),i); } 
  76. void del(h_segment_p y)          { delete bb1_tree::del(Convert(y)); } 
  77. void del_item(seg_tree_item it)  { del(key(it)); } 
  78. h_segment_p& key(seg_tree_item it)   
  79.      { if (!it) error_handler(1,"seg_tree_item gleich nil");
  80.                return (h_segment_p&)it->ke  ; }
  81. GenPtr&   info(seg_tree_item it)              { return key(it)->info(); } 
  82. void         change_inf(seg_tree_item it, GenPtr i) { key(it)->info() = i; }
  83. seg_node_tree(Segment_Tree* p)   {father = p;}
  84. virtual ~seg_node_tree()  {}
  85. friend class Segment_Tree;
  86. } ;
  87. #define forall_seg_tree_items(a,b) for ((b).init_iterator(); a=(b).move_iterator(); )
  88. //------------------------------------------------------------------
  89. // class segment_tree
  90. //------------------------------------------------------------------
  91. class Segment_Tree  : public bb1_tree {
  92. virtual  h_segment_p new_y_h_segment(GenPtr y)
  93. { cout << "error: virtual new_y_h_segmentn"; y=0; return 0; }
  94. virtual int cmp_dim1(GenPtr,GenPtr) {return 0; }
  95. virtual int cmp_dim2(GenPtr,GenPtr) {return 0; }
  96. virtual void clear_dim1(GenPtr&) {}
  97. virtual void clear_dim2(GenPtr&) {}
  98. virtual void clear_info(GenPtr&) {}
  99. virtual void copy_dim1(GenPtr&)  {}
  100. virtual void copy_dim2(GenPtr&)  {}
  101. virtual void copy_info(GenPtr&)  {}
  102. int seg_cmp(h_segment_p p, h_segment_p q);
  103.   void lrot(bb1_item , bb1_item);
  104.   void rrot(bb1_item , bb1_item);
  105.   void ldrot(bb1_item , bb1_item);
  106.   void rdrot(bb1_item , bb1_item);
  107.   //void change_inf(bb1_item it, seg_node_list i)   { info(it) = i; }
  108.   GenPtr& key(bb1_item it)       
  109.        { if (!it) error_handler(1,"bb1_item in segment_tree gleich nil");
  110.  return it->ke; }
  111.   seg_node_list& info(bb1_item it)    { return (seg_node_list&)(bb1_tree::info(it)); } 
  112.   int start_coord(bb1_item& x,seg_tree_item& i)
  113.       { return (!cmp(key(x),x0(i))); }
  114.   int end_coord(bb1_item& x,seg_tree_item& i)
  115.       { return (!cmp(key(x),x1(i))); }
  116.   int empty(bb1_item);
  117.   void clear(bb1_item& );
  118.   void print(bb1_item , string); 
  119.   protected:
  120.   seg_node_tree r;                // tree with all segments
  121.   int cmp_dummy(int a, int b, int c);
  122.   public :
  123.   
  124.   int cmp(GenPtr, GenPtr)  const    
  125.   { cout << "error: Segment_Tree::cmpn"; return 0; }
  126.   GenPtr x0(seg_tree_item x)    { return (r.key(x))->_x0;  }
  127.   GenPtr x1(seg_tree_item x)    { return (r.key(x))->_x1;  }
  128.   GenPtr y(seg_tree_item x)     { return (r.key(x))->_y;   }
  129.   GenPtr& inf(seg_tree_item x)  { return r.info(x);        }
  130.   GenPtr& x0(h_segment_p x)   { return x->_x0; }
  131.   GenPtr& x1(h_segment_p x)   { return x->_x1; }
  132.   GenPtr& y(h_segment_p x)    { return x->_y; }
  133.   GenPtr& inf(h_segment_p x)  { return x->_inf; }
  134.   void change_inf(seg_tree_item x, GenPtr i)  { r.info(x) = i; }
  135.   seg_tree_item insert(GenPtr, GenPtr, GenPtr, GenPtr i=0 );
  136.   void del(GenPtr, GenPtr, GenPtr);
  137.   void del_item(seg_tree_item it) { del(x0(it),x1(it),y(it)) ; }
  138.   seg_tree_item lookup(GenPtr, GenPtr, GenPtr );
  139.   int member(GenPtr x0, GenPtr x1, GenPtr y) { return (lookup(x0,x1,y)!=0 ) ; }
  140.   list<seg_tree_item> query(GenPtr, GenPtr, GenPtr );
  141.   list<seg_tree_item> x_infinity_query(GenPtr, GenPtr );
  142.   list<seg_tree_item> y_infinity_query(GenPtr );
  143.   list<seg_tree_item> all_items();
  144.   void clear_tree();  
  145.    Segment_Tree();
  146.    virtual ~Segment_Tree();
  147.   int size()                   { return r.size();   }
  148.   int empty()                  { return (r.size()==0) ; }
  149.   seg_tree_item y_min()        { return r.min();    }
  150.   seg_tree_item y_max()        { return r.max();    }
  151.   void init_iterator()            { r.init_iterator(); }
  152.   seg_tree_item move_iterator()   { return r.move_iterator(); }
  153.   void print_tree()               { print(root,"");    }
  154.   friend class seg_node_tree;
  155. };
  156. //------------------------------------------------------------------
  157. // typed segment_tree
  158. //------------------------------------------------------------------
  159. template <class  type1, class type2, class itype>
  160. class segment_tree : public Segment_Tree {
  161. h_segment_p new_y_h_segment(GenPtr y)
  162. { type1 x1; 
  163.   type2 x2;
  164.   GenPtr p = Copy(x1);
  165.   GenPtr q = Copy(x2);
  166.   return new h_segment(p,q,y);
  167.  }
  168. int cmp_dim1(GenPtr x,GenPtr y) { return LEDA_COMPARE(type1,x,y); }
  169. int cmp_dim2(GenPtr x,GenPtr y) { return LEDA_COMPARE(type2,x,y); }
  170. void clear_dim1(GenPtr& x)     { LEDA_CLEAR(type1,x); }
  171. void clear_dim2(GenPtr& x)     { LEDA_CLEAR(type2,x); }
  172. void clear_info(GenPtr& x)     { LEDA_CLEAR(itype,x); }
  173. void copy_dim1(GenPtr& x)     { LEDA_COPY(type1,x); }
  174. void copy_dim2(GenPtr& x)     { LEDA_COPY(type2,x); }
  175. void copy_info(GenPtr& x)     { LEDA_COPY(itype,x); }
  176. int cmp(GenPtr x, GenPtr y) const { return LEDA_COMPARE(type1,x,y);}
  177. public:
  178. type1  x0(seg_tree_item it)  { return LEDA_ACCESS(type1,Segment_Tree::x0(it)); }
  179. type1  x1(seg_tree_item it)  { return LEDA_ACCESS(type1,Segment_Tree::x1(it)); }
  180. type2   y(seg_tree_item it)  { return LEDA_ACCESS(type2,Segment_Tree::y(it));  }
  181. itype inf(seg_tree_item it)  { return LEDA_ACCESS(itype,Segment_Tree::inf(it));}
  182. seg_tree_item insert(type1 x0, type1 x1, type2 y, itype i)
  183. { return Segment_Tree::insert(Convert(x0),Convert(x1),Convert(y),Convert(i)); }
  184. void del(type1 x0, type1 x1, type2 y)
  185. { Segment_Tree::del(Convert(x0),Convert(x1),Convert(y)); }
  186. seg_tree_item lookup(type1 x0, type1 x1, type2 y)
  187. { return Segment_Tree::lookup(Convert(x0),Convert(x1),Convert(y)); }
  188. int member(type1 x0, type1 x1, type2 y)
  189. { return Segment_Tree::member(Convert(x0),Convert(x1),Convert(y)); }
  190. list<seg_tree_item> query(type1 x,type2 y0,type2 y1)
  191. { return Segment_Tree::query(Convert(x),Convert(y0),Convert(y1)); }
  192. list<seg_tree_item> x_infinity_query(type2 y0,type2 y1)
  193. { return Segment_Tree::x_infinity_query(Convert(y0),Convert(y1)); }
  194. list<seg_tree_item> y_infinity_query(type1 x)
  195. { return Segment_Tree::y_infinity_query(Convert(x)); }
  196. segment_tree()  {}
  197. ~segment_tree()
  198.  { seg_tree_item z;
  199.   forall_seg_tree_items(z,r)
  200.   { type1 t1 = x0(z); Clear(t1); 
  201.           t1 = x1(z); Clear(t1); 
  202.     type2 t2 = y(z);  Clear(t2); 
  203.     itype i  = inf(z); Clear(i); 
  204.     delete r.key(z); }
  205.  }
  206. } ;
  207. //------------------------------------------------------------------
  208. // Iterator
  209. //------------------------------------------------------------------
  210. #define forall_seg_tree_items(a,b) for ((b).init_iterator(); a=(b).move_iterator(); )
  211. #endif