完善版本散列表

  1 #include <iostream>
  2 #include <vector>
  3 #include <string>
  4 #include<random>
  5 using namespace std;
  6 
  7 template<class T=long long>class factory {
  8 public:
  9     
 10     T num;
 11     factory(T data):num(data){}
 12     size_t f(long long) { return (num>>32)+static_cast<int>(num); }
 13     size_t f(char) { return static_cast<size_t>(num); }
 14     size_t f(string s) {
 15         random_device t;
 16         size_t sz = 0;
 17         for (size_t i = 0; i < s.size(); ++i)
 18         {
 19             sz +=static_cast<size_t>(s[i])*static_cast<size_t>(s[i]);
 20         }
 21         return sz;
 22     }
 23 };
 24 
 25 template<typename T = int>class Hash {
 26 public:
 27 
 28     Hash() = delete;
 29 
 30     Hash(size_t scale, size_t a, size_t b, vector<T>vec) :scale(scale), a(a), b(b), vec(vec) { size = 0; }
 31 
 32 
 33 
 34     void insert(T data);
 35 
 36     void remove(T data);
 37 
 38     auto find(T data);
 39 
 40     vector<T>vec;
 41 
 42     void resize();
 43 
 44 private:
 45     size_t  scale;//规模
 46 
 47     int a, b;//除余法;
 48 
 49     size_t size;
 50 
 51     double factor;
 52 };
 53 
 54 template<typename T> void Hash<T>::insert(T data) {
 55 
 56     vec[find(data)] = data;
 57     size++;
 58     if ((factor = static_cast<decltype(factor)>(size) / scale) > 0.6)
 59         resize();
 60 
 61 }
 62 
 63 template<class T>void Hash<T>::resize() {
 64     vector<T>tmp = vec;
 65     vec = vector<T>(2 * scale, 0);
 66     auto t = scale;
 67     scale *= 2;
 68     for (size_t i = 0; i < t; ++i)
 69     {
 70         if (tmp[i] != 0 && tmp[i] != INT_MIN)
 71             vec[find(tmp[i])] = tmp[i];
 72     }
 73 
 74 }
 75 
 76 template<typename T> void Hash<T>::remove(T data) {
 77     auto get = factory<T>(data).f(data);
 78     auto key = (a * get + b) % scale;
 79     decltype(this->scale)i = 0;
 80     if (vec[key] == data)
 81         vec[key] = INT_MIN;
 82     else {
 83         while (vec[key] != data && i < scale)
 84         {
 85             i++;
 86             key++;
 87             if (key == scale)
 88                 key = 0;
 89         }
 90         if (i == scale) {
 91             cout << "can't find your data:  " << data << endl;
 92             return;
 93         }
 94         vec[key] = INT_MIN;
 95     }
 96     size--;
 97 
 98 }
 99 
100 template<typename T> auto Hash<T>::find(T data) {
101     auto get = factory<T>(data).f(data);
102     auto key = (a *get + b) % scale;
103     if (!vec[key] || vec[key] == INT_MIN)
104         return key;
105     else
106     {
107         while (vec[key] != INT_MIN && vec[key] != 0)
108         {
109             key++;
110             if (key == scale)
111                 key = 0;
112         }
113         return key;
114     }
115 
116 
117 }
118 
119 template<>class Hash<string> {
120 public:
121     using T = string;
122     Hash() = delete;
123 
124     Hash(size_t scale, size_t a, size_t b, vector<T>vec) :scale(scale), a(a), b(b), vec(vec) { size = 0; }
125 
126     auto find(T data) {
127         auto get = factory<T>(data).f(data);
128         auto key = (a * get + b) % scale;
129         if (vec[key] == "0" || vec[key] == "deleted")
130             return key;
131         else
132         {
133             while (vec[key] != "0" && vec[key] != "deleted")
134             {
135                 key++;
136                 if (key == scale)
137                     key = 0;
138             }
139             return key;
140         }
141     }
142 
143     void insert(T data) {
144         vec[find(data)] = data;
145         size++;
146         if ((factor = static_cast<decltype(factor)>(size) / scale) > 0.6)
147             resize();
148     }
149 
150     void remove(T data){
151         auto get = factory<T>(data).f(data);
152         auto key = (a * get + b) % scale;
153         decltype(this->scale)i = 0;
154         if (vec[key] == data)
155             vec[key] = "deleted";
156         else {
157             while (vec[key] != data && i < scale)
158             {
159                 i++;
160                 key++;
161                 if (key == scale)
162                     key = 0;
163             }
164             if (i == scale) {
165                 cout << "can't find your data:  " << data << endl;
166                 return;
167             }
168             vec[key] = "deleted";
169         }
170         size--;
171     }
172 
173     vector<T>vec;
174 
175     void resize() {
176         vector<T>tmp = vec;
177         vec = vector<T>(2 * scale, "0");
178         auto t = scale;
179         scale *= 2;
180         for (size_t i = 0; i < t; ++i)
181         {
182             if (tmp[i] != "0" && tmp[i] != "deleted")
183                 vec[find(tmp[i])] = tmp[i];
184         }
185     }
186 
187 private:
188     size_t  scale;//规模
189 
190     int a, b;//除余法;
191 
192     size_t size;
193 
194     double factor;
195 };
196 
197 int main()
198 {
199     int a, b, M;
200     cout << "a" << endl;
201     cin >> a;
202     cout << "b" << endl;
203     cin >> b;
204     cout << "M" << endl;
205     cin >> M;
206 
207     vector<string>vec(M, "0");
208     Hash<string>hash(M, a, b, move(vec));
209     /*hash.insert(2011);
210     hash.insert(2012);
211     hash.insert(2013);
212     hash.insert(2014);
213     hash.insert(2015);
214     hash.insert(2016);
215     hash.insert(2017);
216     hash.insert(3456);
217     hash.insert(4000);*/
218     hash.insert("11jj0");
219     hash.insert("wocao12");
220     hash.insert("wocao");
221     hash.insert("wocao");
222     for (auto i : hash.vec)
223         cout << i << ends;
224     cout << endl;
225     hash.remove("11jj0");
226     for (auto i : hash.vec)
227         cout << i << ends;
228     cout << endl;
229     hash.insert("11jj0");
230     for (auto i : hash.vec)
231         cout << i << ends;
232     cout << endl;
233     /*hash.insert(19);
234     hash.insert(3);
235     for (auto i : hash.vec)
236         cout << i << ends;
237     cout << endl;
238     hash.remove(2);
239     hash.remove(1);*/
240     /*hash.remove(2011);
241     hash.remove(2079);*/
242     /*for (auto i : hash.vec)
243         cout << i << ends;
244     cout << endl;*/
245     /*hash.remove(2082);
246     for (auto i : hash.vec)
247         cout << i << ends;
248     cout << endl;
249     hash.insert(2069);
250     for (auto i : hash.vec)
251         cout << i << ends;*/
252 
253 }

 

还有两个月n2没时间,しかたない 趁着有着半点时间写了点数据结构
posted @ 2020-10-06 22:02  世界を変える御宅族  阅读(150)  评论(0编辑  收藏  举报