散列樹

散列樹

散列樹選擇從2開始的連續質數來建立一個十層的哈希樹。第一層結點為根結點,根結點下有2個結點;第二層的每個結點下有3個結點;依此類推,即每層結點的子節點數目為連續的質數。

基本介紹

  • 中文名:散列樹
  • 套用學科:計算機
  • 適用領域範圍:計算機
  • 適用領域範圍:數據運算
散列樹,特點,C++代碼,

散列樹

我們選擇質數分辨算法來建立一棵散列樹(Hash樹)。
選擇從2開始的連續質數來建立一個十層的哈希樹。第一層結點為根結點,根結點下有2個結點;第二層的每個結點下有3個結點;依此類推,即每層結點的子節點數目為連續的質數。到第十層,每個結點下有29個結點。如下圖所示:
同一結點中的子結點,從左到右代表不同的餘數結果。
例如:第二層結點下有三個子節點。那么從左到右分別代表:除3餘0,除3餘1,除3餘2.
對質數進行取余操作得到的餘數決定了處理的路徑。結點:結點的關鍵字(在整個樹中是唯一的),結點的數據對象,結點是否被占據的標誌位(標誌位為真時,關鍵字才被認為是有效的),和結點的子結點數組。

特點

  1. 哈希樹的結構是動態的,也不像某些哈希算法那樣需要長時間的初始化過程,只需要初始化根結點就可以開始工作。哈希樹也沒 有必要為不存在的關鍵字提前分配空間。
  2. 查找迅速,最多只需要10次取余和比較操作,就可知道這個對象是否存在。哈希樹的查找次數和元素個數沒有關係。
  3. 結構不變,哈希樹在刪除的時候並不做任何結構調整。這也是它的一個非常好的優點。常規樹結構在增加元素和刪除元素的時候都要做一定的結構調整。
  4. 非排序性,哈希樹不支持排序,沒有順序特性。需要注意的是:哈希樹是一個單向增加的結構,即隨著所需要存儲的數據量增加而增大。即使數據量減少到原來的數量,但是哈希樹的總結點樹不會減少。這樣做的目的是為了避免結構的調整帶來的額外消耗。

C++代碼

  1. // HashTree.cpp : 定義控制台應用程式的入口點。
  2. //選擇質數分辨算法構造一棵哈希樹
  3. #include "stdafx.h"
  4. #include <iostream>
  5. using namespace std;
  6. const int SIZE = 32;//第10個質數為29,餘數不可能大於32,所以數組的固定長度設定為32
  7. const int Prime[10] = {2,3,5,7,11,13,17,19,23,29};
  8. //哈希結點類型
  9. template<class T1, class T2>
  10. class HashNode
  11. {
  12. public:
  13. HashNode();//默認構造函式
  14. HashNode(T1 key, T2 value);//一般構造函式
  15. ~HashNode();
  16. public:
  17. T1 m_key; //結點的關鍵字
  18. T2 m_value; //結點的數據對象
  19. bool occupied; //結點是否被占據,如果是表示結點的關鍵字有效
  20. HashNode *child[SIZE]; //結點的子結點數組
  21. };
  22. template<class T1, class T2>
  23. HashNode<T1,T2>::HashNode()
  24. {
  25. occupied=false;
  26. memset(child, NULL, SIZE*sizeof(HashNode<T1,T2>*));
  27. }
  28. template<class T1, class T2>
  29. HashNode<T1,T2>::HashNode(T1 key, T2 value)
  30. {
  31. this->m_key = key;
  32. this->m_value = value;
  33. occupied=false;
  34. memset(child, NULL, SIZE*sizeof(HashNode<T1,T2>*));
  35. }
  36. template<class T1, class T2>
  37. HashNode<T1,T2>::~HashNode()
  38. {
  39. }
  40. //哈希樹類型
  41. template<class T1, class T2>
  42. class HashTree
  43. {
  44. public:
  45. HashTree();
  46. ~HashTree();
  47. void InsertNode(T1 key, T2 value);
  48. bool FindNode(T1 key, T2 &value);
  49. void DeleteNode(T1 key);
  50. private:
  51. HashNode<T1,T2> *root;
  52. void Insert(HashNode<T1,T2> *hashNode, int level, T1 key, T2 value);//插入結點
  53. bool Find(HashNode<T1,T2> *hashNode, int level, T1 key, T2 value);//查找
  54. void Delete(HashNode<T1,T2> *hashNode, int level,T1 key);//刪除結點
  55. };
  56. template<class T1, class T2>
  57. HashTree<T1,T2>::HashTree()
  58. {
  59. root = new HashNode<T1,T2>;
  60. }
  61. template<class T1, class T2>
  62. HashTree<T1,T2>::~HashTree()
  63. {
  64. }
  65. template<class T1, class T2>
  66. void HashTree<T1,T2>::InsertNode(T1 key, T2 value)
  67. {
  68. Insert(root,0,key,value);
  69. }
  70. template<class T1, class T2>
  71. void HashTree<T1,T2>::Insert(HashNode<T1, T2> *hashNode, int level, T1 key, T2 value)//插入結點
  72. {
  73. if(hashNode->occupied == false)
  74. {
  75. hashNode->m_key = key;
  76. hashNode->m_value = value;
  77. hashNode->occupied = true;
  78. return;
  79. }
  80. int index = key%Prime[level];
  81. if (hashNode->child[index] == NULL)
  82. {
  83. hashNode->child[index] = new HashNode<T1,T2>;
  84. }
  85. level += 1;
  86. Insert(hashNode->child[index], level, key, value);
  87. }
  88. template<class T1, class T2>
  89. bool HashTree<T1,T2>::FindNode(T1 key, T2 &value)
  90. {
  91. return Find(root, 0, key, value);
  92. }
  93. template<class T1, class T2>
  94. bool HashTree<T1,T2>::Find(HashNode<T1,T2> *hashNode, int level, T1 key, T2 value)//查找
  95. {
  96. if (hashNode->occupied == true)
  97. {
  98. if (hashNode->m_key == key)
  99. {
  100. value = hashNode->m_value;
  101. return true;
  102. }
  103. }
  104. int index = key%Prime[level];
  105. if (hashNode->child[index] == NULL)
  106. {
  107. return false;
  108. }
  109. level += 1;
  110. return Find(hashNode->child[index], level, key, value);
  111. }
  112. template<class T1, class T2>
  113. void HashTree<T1,T2>::DeleteNode(T1 key)
  114. {
  115. Delete(root, 0, key);
  116. }
  117. template<class T1, class T2>
  118. void HashTree<T1,T2>::Delete(HashNode<T1,T2> *hashNode, int level, T1 key)//刪除結點
  119. {
  120. if (hashNode->occupied == true)
  121. {
  122. if (hashNode->m_key == key)
  123. {
  124. hashNode->occupied = false;
  125. cout << "關鍵字為" << key << "結點已被刪除!" << endl;
  126. return;
  127. }
  128. }
  129. int index = key%Prime[level];
  130. if (hashNode->child[index] == NULL)
  131. {
  132. cout << "該關鍵字不存在!" << endl;
  133. return;
  134. }
  135. level += 1;
  136. Delete(hashNode->child[index], level, key);
  137. }
  138. int _tmain(int argc, _TCHAR* argv[])
  139. {
  140. HashTree<int, int> ht;
  141. ht.InsertNode(1, 8);
  142. ht.InsertNode(2, 0);
  143. ht.InsertNode(3, 4);
  144. ht.InsertNode(4, 7);
  145. ht.InsertNode(5, 4);
  146. ht.InsertNode(6, 3);
  147. ht.InsertNode(7, 8);
  148. int nvalue = 0;
  149. cout << ht.FindNode(5,nvalue) << endl;
  150. cout << ht.FindNode(9,nvalue) << endl;
  151. ht.DeleteNode(4);
  152. ht.DeleteNode(10);
  153. cout<<"baasdfas"<<endl;
  154. system("pause");
  155. return 0;
  156. }

相關詞條

熱門詞條

聯絡我們