數據結構C++(9)散列表(哈希)——鏈表實現(linkHash)


異常類 myExceptions 同 數據結構C++(1)線性表——數組實現(arrayList) 。

抽象類 dictionary 的定義同 數據結構C++(8)字典——鏈表實現(linkDictionary)

類 pairNode, linkDictionary 的定義同數據結構C++(8)字典——鏈表實現(linkDictionary)

類 Hash 的作用是,根據鍵值“key”得到對應的哈希起始位置(散列函數)。

*** 原書代碼中定義的類名為 hash ,會與STL中hash<T> 沖突,因此定義為 Hash,實現代碼在 hash.h 中:

 1 #pragma once
 2 
 3 #include <iostream>
 4 #include <string>
 5 #include <functional>
 6 
 7 template <class K> class Hash;  8 
 9 template<>
10 class Hash<std::string>
11 { 12 public: 13     size_t operator()(const std::string theKey) const
14  { 15         unsigned long hashValue = 0; 16         int length = (int)theKey.length(); 17 
18         for (int i = 0; i < length; i++) 19             hashValue = 5 * hashValue + theKey.at(i); 20 
21         return size_t(hashValue); 22  } 23 }; 24 
25 template<>
26 class Hash<int>
27 { 28 public: 29     size_t operator()(const int theKey) const
30  { 31         return size_t(theKey); 32  } 33 }; 34 
35 template<>
36 class Hash<long>
37 { 38 public: 39     size_t operator()(const long theKey) const
40  { 41         return size_t(theKey); 42  } 43 };

類 linkHash 的定義在 linkHash.h 中:

 1 #pragma once
 2 #include <iostream>
 3 #include <ostream>
 4 #include <string>
 5 #include "hash.h"
 6 #include "dictionary.h"
 7 #include "linkDictionary.h"
 8 #include "myExceptions.h"
 9 
 10 
 11 template<typename K, typename V>
 12 class linkHash : public dictionary<K, V>
 13 {  14 public:  15     linkHash(int theDivisor = 11)  16  {  17         divisor = theDivisor;  18         hashSize = 0;  19         hashTable = new linkDictionary<K, V>*[divisor];  20         for (int i = 0; i < divisor; i++)  21             hashTable[i] = nullptr;  22  }  23     ~linkHash();  24     bool empty() const;  25     int size() const;  26     std::pair<const K, V>* find(const K &theKey) const;        //查找鍵為key的數對
 27     void erase(const K &theKey);  28     void insert(const std::pair<const K, V>& thePair) ;  29 
 30     void output(std::ostream &out);  31 protected:  32     linkDictionary<K, V> **hashTable;  33     int hashSize;                        //哈希表中數對的數量
 34     int divisor;                        //除法散列函數的除數
 35     Hash<K> Hash;                        //映射
 36 };  37 
 38 template<typename K, typename V>
 39 linkHash<K, V>::~linkHash()  40 {  41     for (int i = 0; i < divisor; i++)  42  {  43         if (hashTable[i] != nullptr)  44             delete hashTable[i];  45  }  46     delete[]hashTable;  47 }  48 
 49 template<typename K, typename V>
 50 bool linkHash<K, V>::empty() const
 51 {  52     return hashSize == 0;  53 }  54 
 55 template<typename K, typename V>
 56 int linkHash<K, V>::size() const
 57 {  58     return hashSize;  59 }  60 
 61 template<typename K, typename V>
 62 std::pair<const K, V>* linkHash<K, V>::find(const K &theKey) const        //查找鍵為key的數對
 63 {  64     return hashTable[Hash(theKey) % divisor]->find(theKey);  65 }  66 
 67 template<typename K, typename V>
 68 void linkHash<K, V>::erase(const K &theKey)  69 {  70     hashTable[Hash(theKey) % divisor]->erase(theKey);  71 }  72 
 73 template<typename K, typename V>
 74 void linkHash<K, V>::insert(const std::pair<const K, V>& thePair)  75 {  76     int homeBucket = (int)Hash(thePair.first) % divisor;  77     if (hashTable[homeBucket] == nullptr)  78  {  79         linkDictionary<K, V> *New = new linkDictionary<K, V>;  80         New->insert(thePair);  81         hashTable[homeBucket] = New;  82         hashSize++;  83  }  84     else
 85  {  86         int homeSize = hashTable[homeBucket]->size();  87         hashTable[homeBucket]->insert(thePair);  88         if (hashTable[homeBucket]->size() > homeSize)  89             hashSize++;  90  }  91 }  92 
 93 template<typename K, typename V>
 94 void linkHash<K, V>::output(std::ostream &out)  95 {  96     for (int i = 0; i < divisor; i++)  97  {  98         linkDictionary<K, V> *Tmp = hashTable[i];  99         out << "hashTable[" << i << "]:"; 100         if (Tmp != nullptr) 101             Tmp->output(out); 102         out << std::endl; 103  } 104 } 105 
106 template<typename K, typename V>
107 std::ostream &operator<<(std::ostream &out, linkHash<K, V> &cLinkHash) 108 { 109     cLinkHash.output(out); 110     return out; 111 }

參考文獻:

[1].Sartaj Sahni. 數據結構、算法與應用[M]. 機械工業出版社, 2000.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM