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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  skiplist.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_SKIPLIST_H
  12. #define LEDA_SKIPLIST_H
  13. #include <LEDA/basic.h>
  14. //------------------------------------------------------------------------------
  15. // Pugh's skip lists
  16. //------------------------------------------------------------------------------
  17. class skiplist_node
  18.   friend class skiplist;
  19.   static unsigned long id_count;
  20.   GenPtr key;
  21.   GenPtr inf;
  22.   int    level;
  23.   unsigned long id;           // id number
  24.   skiplist_node* pred;  
  25.   skiplist_node* backward;  
  26.   skiplist_node* forward[1];  // variable sized array of forward pointers 
  27.   friend unsigned long ID_Number(skiplist_node* p) { return p->id; }
  28.  };
  29. typedef skiplist_node* skiplist_item;
  30. class skiplist
  31. {  
  32.    int level;                  // maximum level
  33.    skiplist_node*  header;     // pointer to header
  34.    skiplist_item STOP;         // pointer to end 
  35.    unsigned long randomBits;   // random bit source
  36.    int randomsLeft;            // number of unused bit pairs in randomBits
  37.    int count;                  // number of entries
  38.    float prob;                 
  39.    random_source ran;
  40.    int  randomLevel();
  41. virtual int cmp(GenPtr, GenPtr) const { return 0; }
  42. virtual void copy_key(GenPtr&)  const {}
  43. virtual void copy_inf(GenPtr&)  const {}
  44. virtual void clear_key(GenPtr&) const {}
  45. virtual void clear_inf(GenPtr&) const {}
  46. virtual void print_key(GenPtr)  const {}
  47. virtual void print_inf(GenPtr)  const {}
  48. virtual int int_type()    const { return 0; }
  49. skiplist_item search(GenPtr,int&) const;
  50. void          remove_item(skiplist_item);
  51. void          insert_item_at_item(skiplist_item,skiplist_item);
  52. public:
  53.  skiplist_item item(void* p) const { return skiplist_item(p); }
  54.  skiplist(float prob = 0.25);
  55.  skiplist(const skiplist&);
  56.  skiplist& operator=(const skiplist&);
  57.  virtual ~skiplist();
  58.  GenPtr key(skiplist_item p) const;
  59.  GenPtr inf(skiplist_item p) const;
  60.  GenPtr& info(skiplist_item p) const;
  61.  int     get_level(skiplist_item p) const;
  62.  skiplist_item insert(GenPtr key, GenPtr inf);
  63.  skiplist_item locate(GenPtr key) const;
  64.  skiplist_item locate_succ(GenPtr key) const;
  65.  skiplist_item locate_pred(GenPtr key) const;
  66.  skiplist_item lookup(GenPtr key) const;
  67.  skiplist_item min() const;
  68.  skiplist_item max() const;
  69.  void          reverse_items(skiplist_item,skiplist_item);
  70.  void          del(GenPtr key);
  71.  void          del1(GenPtr key);
  72.  void          conc(skiplist&);
  73.  void          split_at_item(skiplist_item,skiplist&,skiplist&);
  74.  void          print();
  75.  skiplist_item insert_at_item(skiplist_item p, GenPtr key, GenPtr inf);
  76.  skiplist_item insert1(GenPtr key, GenPtr inf);
  77.  void          change_inf(skiplist_item p, GenPtr inf);
  78.  void          del_item(skiplist_item p);
  79.  void          clear();
  80.  int           size() const;
  81.  int           empty() const;
  82.  skiplist_item first_item() const;
  83.  skiplist_item next_item(skiplist_item p) const;
  84.  skiplist_item succ(skiplist_item p) const;
  85.  skiplist_item pred(skiplist_item p) const;
  86.  // piority queue operations
  87.  skiplist_item find_min() const;
  88.  void del_min();
  89.  void decrease_key(skiplist_item p, GenPtr k);
  90. };
  91. inline GenPtr  skiplist::key(skiplist_item p) const { return p->key; }
  92. inline GenPtr  skiplist::inf(skiplist_item p) const { return p->inf; }
  93. inline GenPtr& skiplist::info(skiplist_item p) const { return p->inf; }
  94. inline int     skiplist::get_level(skiplist_item p) const { return p->level; }
  95. inline skiplist_item skiplist::first_item() const  
  96. { skiplist_item q = header->forward[0];
  97.   return (q==STOP) ? 0 : q;
  98.  }
  99. inline skiplist_item skiplist::min() const  
  100. { skiplist_item q = header->forward[0];
  101.   return (q==STOP) ? 0 : q;
  102.  }
  103. inline skiplist_item skiplist::max() const  
  104. { skiplist_item q = STOP->pred;
  105.   return (q==header) ? 0 : q;
  106.  }
  107. inline skiplist_item skiplist::next_item(skiplist_item p) const 
  108. { skiplist_item q =  p->forward[0]; 
  109.   return (q==STOP) ? 0 : q;
  110.  }
  111. inline skiplist_item skiplist::succ(skiplist_item p) const 
  112. { skiplist_item q =  p->forward[0]; 
  113.   return (q==STOP) ? 0 : q;
  114.  }
  115. inline skiplist_item skiplist::pred(skiplist_item p) const 
  116. { skiplist_item q =  p->pred; 
  117.   return (q==header) ? 0 : q;
  118.  }
  119. inline void skiplist::change_inf(skiplist_item p, GenPtr inf) 
  120. { clear_inf(p->inf); 
  121.   copy_inf(inf);  
  122.   p->inf = inf; 
  123.  }
  124. inline int  skiplist::size() const { return count; }
  125. inline int  skiplist::empty() const { return count==0; }
  126. //priority queue
  127. inline skiplist_item skiplist::find_min() const { return min(); }
  128. inline void skiplist::del_min() 
  129. { skiplist_item p = min(); if (p) del_item(p); }
  130. inline void skiplist::decrease_key(skiplist_item p, GenPtr k) 
  131. { insert(k,p->inf); del_item(p);}
  132. #if !defined(__TEMPLATE_FUNCTIONS__)
  133. // dummy I/O and cmp functions
  134. inline void Print(const skiplist&,ostream&) { }
  135. inline void Read(skiplist&, istream&) { }
  136. inline int  compare(const skiplist&,const skiplist&) { return 0; }
  137. #endif
  138. #endif