Advertisement
Guest User

Untitled

a guest
Dec 16th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.19 KB | None | 0 0
  1. /*Реализуйте структуру данных типа “множество строк” на основе динамической хеш - таблицы с открытой адресацией.Хранимые строки непустые и состоят из строчных латинских букв.Начальный размер таблицы должен быть равным 8 - ми.
  2. Перехеширование выполняйте при добавлении элементов в случае, когда коэффициент заполнения таблицы достигает 3 / 4.
  3. Хеш - функцию строки реализуйте с помощью вычисления значения многочлена методом Горнера.
  4. Структура данных должна поддерживать операции добавления строки в множество, удаления строки из множества и проверки принадлежности данной строки множеству.
  5. Для разрешения коллизий используйте двойное хеширование.*/
  6.  
  7.  
  8. #include "stdafx.h"
  9. #include <iostream>
  10. #include<vector>
  11. #include<string>
  12.  
  13. using std::string;
  14. using std::vector;
  15.  
  16. template <class T>
  17. class HashT
  18. {
  19. public:
  20. HashT(T Empty, T Delete);
  21. /*~HashT()
  22. {
  23. for (int i = 0; i < size; i++)
  24. buffer.pop_back();
  25. }*/
  26. bool Insert(T& s);
  27. bool Delete(T& s);
  28. bool Search(T& s);
  29. private:
  30. long long size;
  31. vector<T> buffer;
  32. long long realsize;
  33. void grow();
  34. long long hash1(T& s);
  35. long long hash2(T& s);
  36. T DEL;
  37. T EMP;
  38. };
  39.  
  40. template<class T>
  41. HashT<T>::HashT(T Empty, T Delete)
  42. {
  43. EMP = Empty;
  44. DEL = Delete;
  45. size = 8;
  46. realsize = 0;
  47. buffer.assign(8, EMP);
  48. }
  49.  
  50. template<class T>
  51. long long HashT<T>::hash1(T& s)
  52. {
  53.  
  54. const int a = 17;
  55. long long h = 0;
  56. for (int i = 0; i < s.size(); i++) {
  57. h = (h*a + s[i]) % size;
  58. }
  59. return h;
  60. }
  61.  
  62. template<class T>
  63. long long HashT<T>::hash2(T &s)
  64. {
  65. long long h= 0;
  66. int a = 19;
  67. for (int i = s.size() - 1; i >= 0; i--) {
  68. h = (h * a + s[i]) % size;
  69. }
  70.  
  71. return h % 2 == 0 ? h + 1 : h;
  72. }
  73.  
  74. template <class T>
  75. void HashT<T>::grow()
  76. {
  77. vector<T> oldbuffer = buffer;
  78. buffer.assign(size * 2, EMP);
  79. realsize = 0;
  80.  
  81. for (int i = 0; i < size; i++) {
  82. if (oldbuffer[i] != EMP && oldbuffer[i] != DEL) {
  83. Insert(oldbuffer[i]);
  84. }
  85. }
  86. size *= 2;
  87. }
  88.  
  89. template <class T>
  90. bool HashT<T>::Insert(T &s)
  91. {
  92. if (realsize > size * 3 / 4) {
  93. grow();
  94. }
  95. long long place = -1;
  96. long long h1 = hash1(s);
  97. long long h2 = hash2(s);
  98. for (int i = 0; i < size; i++)
  99. {
  100. if (buffer[h1] != EMP && buffer[h1] != DEL && buffer[h1] == s)
  101. {
  102. return false;
  103. }
  104. else
  105. if (buffer[h1] == EMP) {
  106. if (place == -1)
  107. place = h1;
  108. break;
  109. }
  110. else
  111. if (buffer[h1] == DEL && place == -1)
  112. place = h1;
  113. h1 = (h1 + h2) % size;
  114. }
  115. if (buffer[place] != EMP) {
  116. buffer[place] = EMP;
  117. }
  118. if (place == -1) {
  119. return false;
  120. }
  121. buffer[place] = s;
  122. realsize++;
  123. return true;
  124. }
  125.  
  126. template <class T>
  127. bool HashT<T>::Delete(T &s)
  128. {
  129. long long h1 = hash1(s);
  130. long long h2 = hash2(s);
  131. for (int i = 0; i < size; i++) {
  132. if (buffer[h1] != EMP && buffer[h1] != DEL && buffer[h1] == s)
  133. break;
  134. else
  135. if (buffer[h1] == EMP)
  136. return false;
  137. h1 = (h1 + h2) % size;
  138. }
  139. buffer[h1] = DEL;
  140. realsize++;
  141. return true;
  142. }
  143.  
  144. template <class T>
  145. bool HashT<T>::Search(T &s)
  146. {
  147. long long h1 = hash1(s);
  148. long long h2 = hash2(s);
  149. for (int i = 0; i < size; i++) {
  150. if (buffer[h1]!=DEL && buffer[h1]!=EMP && buffer[h1] == s)
  151. return true;
  152. else
  153. if (buffer[h1] == DEL)
  154. break;
  155. h1 = (h1 + h2) % size;
  156. }
  157.  
  158. return false;
  159. }
  160.  
  161. int main()
  162. {
  163. HashT<string>* hashtable = new HashT<string>("EMPTY", "DELETE");
  164. char operation;
  165. bool property;
  166. string s;
  167. while (std::cin >> operation)
  168. {
  169. std::cin >> s;
  170. operation == '+' ? property = hashtable->Insert(s) : (operation == '-' ? property = hashtable->Delete(s) : property = hashtable->Search(s));
  171. property ? std::cout << "OK" : std::cout << "FAIL";
  172. std::cout << std::endl;
  173. }
  174. return 0;
  175. //delete hashtable;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement