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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  ch_hash.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_CH_HASHING_H
  12. #define LEDA_CH_HASHING_H
  13. //------------------------------------------------------------------------------
  14. // Hashing with Chaining
  15. //
  16. // S. Naeher  (1994)
  17. //
  18. //------------------------------------------------------------------------------
  19. #include <LEDA/basic.h>
  20.  
  21. //------------------------------------------------------------------------------
  22. // class ch_hash_elem  
  23. //------------------------------------------------------------------------------
  24. class ch_hash_elem 
  25. {
  26.   friend class ch_hash;
  27.   ch_hash_elem* succ;
  28.   GenPtr k;
  29.   GenPtr i;
  30.   public:
  31.   ch_hash_elem(GenPtr key, GenPtr inf, ch_hash_elem* next = 0) 
  32.   { k = key; 
  33.     i = inf; 
  34.     succ = next;
  35.    }
  36.   ch_hash_elem() {}
  37.   LEDA_MEMORY(ch_hash_elem)
  38. };
  39. typedef ch_hash_elem*  ch_hash_item;
  40. //--------------------------------------------------------------------
  41. // class ch_hash
  42. //--------------------------------------------------------------------
  43. class ch_hash 
  44. {
  45.    static ch_hash_elem STOP;
  46.    ch_hash_elem* table;
  47.    int table_size;           
  48.    int table_size_1;           
  49.    int low_table;           
  50.    int high_table;           
  51.    int count;
  52.    virtual int hash_fct(GenPtr x)  const { return *(int*)(&x); }
  53.    virtual int cmp(GenPtr, GenPtr) const { return 0; }
  54.    virtual void clear_key(GenPtr&) const { }
  55.    virtual void clear_inf(GenPtr&) const { }
  56.    virtual void copy_key(GenPtr&)  const { }
  57.    virtual void copy_inf(GenPtr&)  const { }
  58.    virtual void print_key(GenPtr)  const { }
  59.    virtual int_type() const { return 0; }
  60.    int  next_pow(int) const;
  61.    void init(int);
  62.    void rehash(int);
  63.    void destroy();
  64.    ch_hash_item search(GenPtr,ch_hash_item&) const;
  65.    protected:
  66.    ch_hash_item item(GenPtr p) const { return ch_hash_item(p) ; }
  67.    public:
  68.    ch_hash_item lookup(GenPtr x) const;
  69.    ch_hash_item insert(GenPtr,GenPtr);
  70.    ch_hash_item first_item() const { return 0; }
  71.    ch_hash_item next_item(ch_hash_item) const { return 0; }
  72.    void del(GenPtr);
  73.    void del_item(ch_hash_item);
  74.    bool member(GenPtr x)   const  { return ( lookup(x) ? true : false ); } 
  75.    GenPtr  key(ch_hash_item p)  const { return p->k; }
  76.    GenPtr  inf(ch_hash_item p)  const { return p->i; }
  77.    GenPtr& info(ch_hash_item p)       { return p->i; }
  78.    void change_inf(ch_hash_item, GenPtr);
  79.    bool empty() const     { return count ? false : true ; } 
  80.    int  size()  const     { return count; } 
  81.    int  tablesize() const { return table_size ; }
  82.    void clear()           { destroy(); init(table_size);}
  83.    ch_hash& operator=(const ch_hash&);
  84.    ch_hash(const ch_hash&);
  85.    ch_hash(int ts = 1<<10) { init(ts); /* init(next_pow(ts)); */ }
  86.    virtual ~ch_hash()     { destroy(); }
  87. };
  88. #endif