完善版本散列表
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没时间,しかたない 趁着有着半点时间写了点数据结构
所望隔山海