zoukankan      html  css  js  c++  java
  • 完善版本散列表

      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没时间,しかたない 趁着有着半点时间写了点数据结构
  • 相关阅读:
    python之路
    go mod
    黑苹果流程
    mac go配置,环境配置
    mac重装系统
    多级分销概念 MongoDB||MySQL
    MongoDB查询mgov2的聚合方法
    linux被当矿机排查案例
    docker-compose容器中redis权限问题
    docker-compose中redis查询版本
  • 原文地址:https://www.cnblogs.com/otakus/p/13775703.html
Copyright © 2011-2022 走看看