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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  interval_set.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_INTERVAL_SET_H
  12. #define LEDA_INTERVAL_SET_H
  13. #include <LEDA/d2_dictionary.h>
  14. typedef dic2_item is_item;
  15. class Interval_Set : public d2_dictionary<double,double,GenPtr> {
  16. public:
  17. double    left(is_item it) { return key1(it); }
  18. double    right(is_item it){ return key2(it); }
  19. list<is_item>  intersection(double x, double y)
  20. { list<dic2_item> l = range_search(-MAXFLOAT,y,x,MAXFLOAT);
  21.   return *((list<is_item>*)&l);
  22. }
  23.  Interval_Set()  {}
  24. ~Interval_Set()  {}
  25. };
  26. /*{Manpage {interval_set} {I} {Sets of Intervals}}*/
  27. template <class I>
  28. class interval_set : private Interval_Set {
  29. /*{Mdefinition
  30. An instance $S$ of the parameterized data type name is a
  31. collection of items ($is_item$). Every item in $S$ contains a closed
  32. interval of the $double$ numbers as key and an information from data type $I$,
  33. called the information type of $S$. The number of items in $S$ is called
  34. the size of $S$. An interval set of size zero is said to be empty. We use
  35. $<x,y,i>$ to denote the item with interval $[x,y]$ and information $i$;
  36. $x$ ($y$) is called the left (right) boundary of the item. For each
  37. interval $[x,y]$ there is at most one item $<x,y,i> in S$.}*/
  38. public:
  39. /*{Mcreation S }*/
  40. interval_set()  {}
  41. /*{Mcreate creates an instance var of type name and initializes var 
  42.             to the empty set.}*/
  43. ~interval_set()  {}
  44. /*{Moperations 2.3 5 }*/
  45. double left(is_item it) {return Interval_Set::left(it);}
  46. /*{Mop      returns the left boundary of item $it$.\
  47.      precond $it$ is an item in var.}*/
  48. double right(is_item it) {return Interval_Set::right(it);}
  49. /*{Mop      returns the right boundary of item $it$.\
  50.      precond $it$ is an item in var.}*/
  51. I   inf(is_item it)  { return LEDA_ACCESS(I,Interval_Set::inf(it)); }
  52. /*{Mop      returns the information of item $it$.\
  53.      precond $it$ is an item in var.}*/
  54. is_item insert(double x, double y, I i)
  55.                       { return Interval_Set::insert(x,y,Copy(i)); }
  56. /*{Mopl     associates the information $i$ with interval 
  57.      $[x,y]$. If there is an item $<x,y,j>$ in var
  58.      then $j$ is replaced by $i$, else a new item
  59.      $<x,y,i>$ is added to $S$. In both cases
  60.      the item is returned.}*/
  61. is_item lookup(double x, double y) {return Interval_Set::lookup(x,y);}
  62. /*{Mop      returns the item with interval $[x,y]$ 
  63.      (nil if no such item exists in var).}*/
  64. list<is_item>  intersection(double a, double b)
  65.                          { return Interval_Set::intersection(a,b); }
  66. /*{Mopl     returns all items $<x,y,i> in S$ with 
  67.      $[x,y] cap [a,b] neq emptyset$.}*/
  68. void del(double x, double y) {Interval_Set::del(x,y);}
  69. /*{Mop      deletes the item with interval $[x,y]$ from var.}*/
  70. void del_item(is_item it) {Interval_Set::del_item(it);}
  71. /*{Mop      removes item $it$ from var.\
  72.      precond $it$ is an item in var.}*/
  73. void    change_inf(is_item it, I i)
  74.                       { Interval_Set::change_inf(it,Copy(i)); }
  75. /*{Mop      makes $i$ the information of item $it$.\
  76.      precond $it$ is an item in var.}*/
  77. void clear() {Interval_Set::clear();}
  78. /*{Mop      makes var the empty interval_set.}*/
  79. bool empty() {return Interval_Set::empty();}
  80. /*{Mop      returns true iff var is empty.}*/
  81. int size() {return Interval_Set::size();}
  82. /*{Mop      returns the size of var.}*/
  83. };
  84. #define forall_is_items(i,D) forall_dic2_items(i,D)
  85. /*{Mimplementation
  86. Interval sets are implemented by two-dimensional range trees cite{Wi85,Lu78}.
  87. Operations insert, lookup, del_item and del take time $O(log^2 n)$,
  88. intersection takes time $O(k + log^2 n)$, where $k$ is the size
  89. of the returned list. Operations left, right, inf, empty, and size
  90. take time $O(1)$, and clear $O(nlog n)$. Here $n$ is always the 
  91. current size of the interval set. The space requirement is $O(nlog n)$.}*/
  92. #endif