d2_dictionary.h
上传用户:gzelex
上传日期:2007-01-07
资源大小:707k
文件大小:6k
开发平台:

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  d2_dictionary.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_d2_dictionary_H
  12. #define LEDA_d2_dictionary_H
  13. #include <LEDA/impl/range_tree.h>
  14. typedef rt_item dic2_item;
  15. /*{Manpage {d2_dictionary} {K1,K2,I} {Two-Dimensional Dictionaries} }*/ 
  16. template<class K1, class K2, class I>
  17. class d2_dictionary : public range_tree {
  18. /*{Mdefinition
  19. An instance $D$ of the parameterized data type name is a
  20. collection of items ($dic2_item$). Every item in $D$ contains a key from the
  21. linearly ordered data type $K1$, a key from the linearly ordered data type $K2$,
  22. and an information from data type $I$. $K1$ and $K2$ are called the key types
  23. of $D$, and $I$ is called the information type of $D$. The number
  24. of items in $D$ is called the size of $D$. A two-dimensional dictionary of size
  25. zero is said to be  empty. We use $<k_1,k_2,i>$ to denote the item with first
  26. key $k_1$, second key $k_2$, and information $i$. For each pair
  27. $(k_1,k_2) in K1 times K2$ there is at most one item $<k_1,k_2,i> in D$.
  28. Additionally to the normal dictionary operations, the data type $d2_dictionary$
  29. supports rectangular range queries on $K1times K2$.}*/
  30.   // redefine the virtual functions of class range_tree
  31.  
  32.   void rt_clear_key(GenPtr*& x) const { 
  33.     LEDA_CLEAR(K1,x[0]); LEDA_CLEAR(K2,x[1]); 
  34.   }
  35.   void rt_copy_key(GenPtr*& x) const { 
  36.     LEDA_COPY(K1,x[0]); LEDA_COPY(K2,x[1]); 
  37.   }
  38.   void rt_print_key(int d,GenPtr*& x) const { 
  39.     if( d==0 ) LEDA_PRINT(K1,x[0],cout);
  40.     else       LEDA_PRINT(K2,x[1],cout);
  41.   }
  42.   
  43.   void rt_clear_inf(GenPtr& x) const { LEDA_CLEAR(I,x);}
  44.   void rt_copy_inf(GenPtr& x)  const { LEDA_COPY(I,x);}
  45.   
  46.   int rt_cmp(int d,GenPtr* x,GenPtr* y) const { 
  47.     if( d==0 ) return LEDA_COMPARE(K1,x[0],y[0]);
  48.     else       return LEDA_COMPARE(K2,x[1],y[1]);
  49.   }
  50.   
  51.   range_tree* new_range_tree(int /*dim*/, int l ) { 
  52.     return new d2_dictionary<K1,K2,I>(l); 
  53.   }
  54.   public:
  55.   
  56. /*{Mcreation D }*/  
  57. d2_dictionary(int l=0) : range_tree(2,l) {}
  58. /*
  59. d2_dictionary();
  60. */
  61. /*{Mcreate creates an instance var of type name and initializes var to 
  62.             the empty dictionary.}*/
  63. ~d2_dictionary() { clear(); }
  64. /*{Moperations 2.8 4.5 }*/
  65.  
  66.     K1 key1(dic2_item it)   { return LEDA_ACCESS(K1,it->key(0));  }
  67. /*{Mop    returns the first key of item $it$.\
  68.    precond $it$ is an item in var.}*/
  69.     K2 key2(dic2_item it)   { return LEDA_ACCESS(K2,it->key(1));  }
  70. /*{Mop  returns the second key of item $it$.\
  71.  precond $it$ is an item in var.}*/
  72.     I inf(dic2_item it)    { return LEDA_ACCESS(I,it->inf());}
  73. /*{Mop     returns the information of item $it$.\
  74.     precond $it$ is an item in var.}*/
  75.     
  76.     dic2_item min_key1() { return range_tree::rt_min(0); }
  77. /*{Mop   returns the item with minimal first key.}*/
  78.     dic2_item min_key2() { return range_tree::rt_min(1); }
  79. /*{Mop   returns the item with minimal second key.}*/
  80.     dic2_item max_key1() { return range_tree::rt_max(0); }
  81. /*{Mop    returns the item with maximal first key.}*/
  82.     dic2_item max_key2() { return range_tree::rt_max(1); }
  83. /*{Mop   returns the item with maximal second key.}*/
  84.     
  85.     dic2_item insert(K1 x, K2 y, I i) { 
  86.       dic2_item p = new rt_elem(Copy(x),Copy(y),Copy(i));
  87.       return range_tree::insert(p);
  88.      }
  89. /*{Mopl  associates the information $i$ with the keys $x$
  90.   and $y$. If there is an item <$x,y,j$> in 
  91.   var then $j$ is replaced by $i$, else a new item 
  92.   <$x,y,i$> is added to $D$. In both cases the
  93.   item is returned.}*/
  94.     dic2_item lookup(K1 x, K2 y) 
  95.     { rt_elem p(Convert(x), Convert(y),0);
  96.       return range_tree::lookup(&p);
  97.     }
  98. /*{Mopl   returns the item with keys $x$ and $y$ 
  99.           (nil if no such item exists in var).}*/
  100.     
  101. list<dic2_item> range_search(K1 x0, K1 x1, K2 y0, K2 y1)  
  102. {  rt_elem p(Convert(x0),Convert(y0),0); rt_elem q(Convert(x1), Convert(y1), 0);
  103.    return range_tree::query(&p,&q); }
  104. /*{Mopl    returns the list of all items <$k_1,k_2,i$> in 
  105.     var with $x_0le k_1 le x_1$ and $y_0le k_2 le y_1$.}*/
  106.     
  107. list<dic2_item> all_items() { return range_tree::all_items(); }
  108. /*{Mop     returns the list of all items of var.}*/
  109. void del(K1 x, K2 y)  
  110.     { rt_elem p(Convert(x),Convert(y),0);
  111.       range_tree::del(&p);
  112.     }
  113. /*{Mop       deletes the item with keys $x$ and $y$ 
  114.               from var.}*/
  115.     
  116. void del_item(dic2_item it) { range_tree::del(it); }
  117. /*{Mop       removes item $it$ from var.\
  118.      precond $it$ is an item in var.}*/
  119. void  change_inf(dic2_item it, I i) {
  120.     LEDA_CLEAR(I,it->inf());
  121.         it->inf() = Copy(i);
  122.     }
  123. /*{Mopl      makes $i$ the information of item $it$.\
  124.      precond $it$ is an item in var.}*/
  125. void clear(){range_tree::clear();}
  126. /*{Mop    makes var the empty d2_dictionary.}*/
  127. bool empty(){return range_tree::empty();}
  128. /*{Mop   returns true if var is empty, false otherwise.}*/
  129. int size(){return range_tree::size();}
  130. /*{Mop    returns the size of var.}*/
  131. };
  132. // iteration macro
  133. // 
  134. #define forall_dic2_items(x,T)  (T).init_iteration(); forall(x,(T).L )
  135. /*{Mimplementation
  136. Two-dimensional dictionaries are implemented by dynamic two-dimensional range
  137. trees cite{Wi85,Lu78} based on BB[$alpha$] trees. Operations insert, lookup, 
  138. del_item, del take time $O(log^2 n)$,  range_search takes time 
  139. $O(k + log^2 n)$, where $k$ is the size of the returned list, key, inf, 
  140. empty, size, change_inf take time $O(1)$, and clear takes time $O(nlog n)$.
  141. Here $n$ is the current size of the dictionary. The space requirement is 
  142. $O(nlog n)$.}*/
  143. #endif