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

MultiPlatform

  1. /*******************************************************************************
  2. +
  3. +  LEDA-R  3.2.3
  4. +
  5. +  dp_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_DP_HASH_H
  12. #define LEDA_DP_HASH_H
  13. //------------------------------------------------------------------------------
  14. // Dynamic Perfect Hashing
  15. //
  16. // Michael Wenzel          ( 1990/91 )
  17. //------------------------------------------------------------------------------
  18. #include <LEDA/basic.h>
  19. // ---------------------------------------------------------------
  20. // declarations
  21. // ---------------------------------------------------------------
  22. class headertable;
  23. class subtable;
  24. class dp_hash;
  25. typedef headertable* htp;
  26. typedef subtable* stp;
  27. #define EMPTY (GenPtr(2147483648))
  28. #define maxuni 2147483647
  29.                                 // #define maxprim 2147483659
  30. // aber kleiner wegen random-Funktion
  31. #define maxprim 2147483647
  32. #define wursechs 2.44948974278
  33. // --------------------------------------------------------------
  34. // class headertable
  35. //
  36. // Items werden auf Headertables gehasht,
  37. // die sie dann injektiv auf Subtables verteilen
  38. class headertable {
  39.   unsigned kj;                     // Multiplikator
  40.   int wj;                          // Anzahl Elemente in Tafel
  41.   int mj;                          // max. Anzahl Elemente
  42.   stp tj;                          // Startpunkt der Subtables
  43.   friend class b_dict;
  44.   friend class dp_hash;
  45.   friend class subtable;
  46.   stp lookup(GenPtr );
  47.   bool insert(GenPtr ,GenPtr ,stp& ,int& ,bool& ,stp ,stp );
  48.   int dinsert(GenPtr ,GenPtr ,stp ,stp& ,stp& );
  49.   bool del(GenPtr ,stp ,stp ); 
  50.   int give_elements(stp& ,stp ,stp );  
  51.   headertable()
  52.     { 
  53.       kj = wj = mj=0; 
  54.       tj=0;   
  55.      }
  56. };
  57. // --------------------------------------------------------------
  58. // class subtable
  59. //
  60. // Jedes Subtableelement ist leer,
  61. // oder von der Headertable wird genau ein Element    
  62. // auf eine Position gehasht
  63. class subtable {
  64.   GenPtr ke;
  65.   GenPtr inf;
  66.   friend class b_dict;
  67.   friend class dp_hash;
  68.   friend class headertable;
  69.   void set_s(GenPtr a,GenPtr b)
  70.     {
  71.        ke=a; inf=b; }
  72.   void clear()
  73.     { 
  74.        ke=EMPTY; inf=0; }
  75.   subtable()
  76.     {  
  77.        ke=EMPTY; inf=0; }
  78.   subtable(GenPtr a ,GenPtr b )
  79.     {  
  80.        ke=a; inf=b; }
  81.   subtable(subtable& s)
  82.     {  
  83.        ke=s.ke;
  84.        inf=s.inf; }
  85.    subtable& operator=(subtable& s)
  86.     {
  87.        ke=s.ke;
  88.        inf=s.inf;
  89.        return *this; }
  90.   public:
  91.   GenPtr key() { return ke; }
  92.   GenPtr info() { return inf; }
  93. };
  94. // ------------------------------------------------------------------
  95. // class dp_hash
  96. //
  97. // alle Informationen fuer das Dictionary
  98. // Elemente werden auf Headertables gehasht, 
  99. // die dann die Elemente weitergeben
  100. // Der Platzverbrauch der Headertables wird kontrolliert
  101. class dp_hash {
  102.   htp* htablep;      // Feld von Zeigern auf Headertables
  103.      // leere Headertables werden nicht angelegt
  104.   unsigned k;        // Verteilungsfunktion (k*x)%p%sM
  105.   int n;             // Anzahl Elemente im Dictionary
  106.   int M;             // Anzahl Elemente, die momentan bzgl.
  107.      // Platzverbrauch mit Wahrscheinlichkeit >= 0.5
  108.      // abgespeichert werden koennen ( ohne Rehash )
  109.   int sM;            // Anzahl Headertables
  110.   int bed;           // Kontrolle des Platzverbrauchs
  111.   stp anf,wo,ende;   // zur Speicherverwaltung beim Rehash
  112.   stp  rehash_all(GenPtr=EMPTY ,GenPtr=0);
  113.   virtual void clear_key(GenPtr&)const {}
  114.   virtual void clear_inf(GenPtr&)const {}
  115.   virtual void copy_key(GenPtr&) const {}
  116.   virtual void copy_inf(GenPtr&) const {}
  117. protected:
  118.   stp item(void* p) const { return stp(p); }
  119. public:
  120.   stp first_item() const
  121.   { error_handler(1,"sorry, dp_hash::first_item not implemented");
  122.     return nil;
  123.    }
  124.   stp next_item(stp) const
  125.   { error_handler(1,"sorry, dp_hash::next_item not implemented");
  126.     return nil;
  127.    }
  128.   dp_hash& operator=(const dp_hash&) 
  129.   { error_handler(1,"sorry, dp_hash::operator= not implemented");
  130.     return *this;
  131.    }
  132.   GenPtr  key(stp it)  const { return it->ke; }
  133.   GenPtr  inf(stp it)  const { return it->inf; }
  134.   GenPtr& info(stp it) const { return it->inf; }
  135.   stp  insert(GenPtr,GenPtr );
  136.   void del(GenPtr);
  137.   void del_item(stp it) { del(it->ke); }
  138.   stp  lookup(GenPtr ) const;
  139.   stp  change_inf(GenPtr ,GenPtr );
  140.   int  size() const { return n; }
  141.   void clear();
  142.   dp_hash();
  143.   dp_hash(int ,GenPtr* ,GenPtr* );
  144.   virtual ~dp_hash();
  145.   friend class b_dict;
  146. };
  147. #endif