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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  int_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_INTSET_H
  12. #define LEDA_INTSET_H
  13. //------------------------------------------------------------------------------
  14. /* int_set: integer sets implemented by bit vectors                           */
  15. //------------------------------------------------------------------------------
  16. #include <LEDA/basic.h>
  17. #define SIZE_OF_ULONG  (8 * sizeof(unsigned long))
  18. /*{Manpage {int_set} {} {Integer Sets}}*/
  19. class int_set {
  20. /*{Mdefinition
  21. An instance $S$ of the data type $int_set$ is a subset of a fixed interval
  22. $[a..b]$ of the integers.}*/
  23.   unsigned long*  V;
  24.   int size;
  25.   int low;
  26. public:
  27. /*{Mcreation S }*/
  28. int_set(int a, int b); 
  29. /*{Mcreate creates an instance var of type $int_set$ for elements from 
  30.             $[a..b]$ and initializes it to the empty set.}*/
  31.  int_set(int n); 
  32. /*{Mcreate creates an instance var of type $int_set$ for elements from 
  33.             $[0..n-1]$ and initializes it to the empty set.}*/
  34.  int_set(const int_set&);
  35. ~int_set() { delete V; } 
  36. /*{Moperations 1.8 5 }*/
  37. void insert(int x);
  38. /*{Mop      adds $x$ to var.\
  39.      precond $ale xle b$.}*/
  40. void del(int x);
  41. /*{Mop     deletes $x$ from var.\
  42.             precond $ale xle b$.}*/
  43. int  member(int x) const;
  44. /*{Mop      returns true if $x$ in var, false otherwise.\
  45.      precond $ale xle b$.}*/
  46. void clear();
  47. /*{Mop      makes var the empty set.}*/
  48. int_set& join(const int_set& );
  49. int_set& intersect(const int_set&);
  50. int_set& complement();
  51. int_set& operator=(const int_set& S1);
  52. /*{Mbinop    assignment.}*/
  53. int_set& operator|=(const int_set&);
  54. int_set& operator&=(const int_set&);
  55. int_set  operator|(const int_set& S1);
  56. /*{Mbinop     returns the union of $S$ and $S1$}*/
  57. int_set  operator&(const int_set& S1);
  58. /*{Mbinop     returns the intersection of $S$ and $S1$}*/
  59. int_set  operator~();
  60. /*{Munop     returns the complement of $S$.}*/
  61. };
  62. inline int  int_set::member(int x)  const
  63. { int i = x-low; 
  64.   return V[i/SIZE_OF_ULONG] & (1 << (i%SIZE_OF_ULONG)); 
  65.  }
  66. inline void int_set::insert(int x) 
  67. { int i  =  x-low; 
  68.   V[i/SIZE_OF_ULONG] |= (1 << (i%SIZE_OF_ULONG)); 
  69.  }
  70. inline void int_set::del(int x)    
  71. { int i   = x-low; 
  72.   V[i/SIZE_OF_ULONG] &= ~(1 << (i%SIZE_OF_ULONG)); 
  73.  }
  74. inline int_set& int_set::operator|=(const int_set& s) { return join(s); }
  75. inline int_set& int_set::operator&=(const int_set& s) { return intersect(s); }
  76. /*{Mimplementation
  77. Integer sets are implemented by bit vectors. Operations insert, delete,
  78. member, empty, and size take constant time. clear, intersection, union 
  79. and complement take time $O(b-a+1)$.}*/
  80. #endif