Advertisement
Guest User

Untitled

a guest
Feb 19th, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.28 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <list>
  5. #include <algorithm>
  6. using namespace std;
  7. typedef unsigned long long hash_value_type;
  8.  
  9. class Hasher
  10. {
  11. public:
  12.         hash_value_type operator()(const string& s, hash_value_type mod);
  13.         Hasher() { P = rand() % (primes_count); }
  14.         void next_hash() { do P = (rand() % primes_count); while (gcd(P, primes_count) != 1); }
  15. private:
  16.         static const int prime[], primes_count;
  17.         unsigned int P;
  18.         int gcd(int a, int b)
  19.         {
  20.                 while ( b )
  21.                         a %= b, swap(a, b);
  22.                 return a;
  23.         }
  24. };
  25.  
  26. const int Hasher::prime[] = {101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997, 1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049, 1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, 1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223, 1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511, 1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571, 1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1637, 1657, 1663, 1667, 1669, 1693, 1697, 1699, 1709, 1721, 1723, 1733, 1741, 1747, 1753, 1759, 1777, 1783, 1787, 1789, 1801, 1811, 1823, 1831, 1847, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1901, 1907, 1913, 1931, 1933, 1949, 1951, 1973, 1979, 1987, 1993, 1997, 1999};
  27. const int Hasher::primes_count = 278;
  28.  
  29. hash_value_type Hasher::operator()(const string& s, hash_value_type mod)
  30. {
  31.         hash_value_type hash = 0;
  32.         for (int i = 0; i < s.length(); ++i)
  33.                 hash = (hash * P + s[i]) % mod;
  34.         return hash;
  35. }
  36.  
  37. class HashTable {
  38. public:
  39.         class iterator;
  40. private:
  41.         typedef vector < list < string > > table_type;
  42.         typedef HashTable::iterator hash_iterator_type;
  43. public:
  44.         int Size() const { return n; }
  45.         void Add(const string& s);
  46.         bool Contain(const string& s);
  47.         void Delete(const string& s);
  48.         HashTable(int base_size = 2) : table(*(new table_type(base_size))), n(0), hasher() {}
  49.         HashTable(const HashTable& hash_table) : hasher(), n(0), table(*(new table_type(hash_table.Size())))
  50.         {
  51.                 for (hash_iterator_type it = hash_table.begin(); it != hash_table.end(); ++it)
  52.                         Add(*it);
  53.         }
  54.         virtual ~HashTable() { delete &table; }
  55.         class iterator
  56.         {
  57.         private:
  58.                 friend class HashTable;
  59.                 const table_type::iterator const table_begin, table_end;
  60.                 table_type::iterator table_it;
  61.                 list < string >::iterator list_it;
  62.                 iterator(const HashTable& ht) : table_begin(ht.table.begin()), table_end(ht.table.end()), table_it(ht.table.begin())
  63.                 {
  64.                         while (table_it != table_end && !table_it->size()) ++table_it;
  65.                         list_it = table_it != table_end ? table_it->begin() : list < string >::iterator();
  66.                 }
  67.                 iterator(const HashTable& ht, const table_type::iterator& table_it, const list < string >::iterator& list_it) :
  68.                         table_begin(ht.table.begin()), table_end(ht.table.end()), list_it(list_it), table_it(table_it) {}
  69.         public:
  70.                 hash_iterator_type& operator++();
  71.                 hash_iterator_type operator++(int);
  72.                 hash_iterator_type& operator--();
  73.                 hash_iterator_type operator--(int);
  74.                 const string& operator*() { return *list_it; }
  75.                 const string& operator->() { return *list_it; }
  76.                 bool operator==(const hash_iterator_type &it) { return table_it == it.table_it && it.list_it == list_it; }
  77.                 bool operator!=(const hash_iterator_type &it) { return !(table_it == table_end && it.table_it == table_end) && (table_it != it.table_it || it.list_it != list_it); }
  78.         };
  79.         hash_iterator_type begin() const { return iterator(*this); }
  80.         hash_iterator_type end() const { return iterator(*this, this->table.end(), list < string >::iterator()); }
  81. private:
  82.         Hasher hasher;
  83.         table_type& table;
  84.         int n;
  85.         void rebuild();
  86. };
  87.  
  88. HashTable::iterator HashTable::iterator::operator++(int)
  89. {
  90.         iterator it = iterator(*this);
  91.         ++(*this);
  92.         return it;
  93. }
  94.  
  95. HashTable::iterator HashTable::iterator::operator--(int)
  96. {
  97.         iterator it = iterator(*this);
  98.         --(*this);
  99.         return it;
  100. }
  101.  
  102. HashTable::iterator& HashTable::iterator::operator++()
  103. {
  104.         if (table_it == table_end) return *this;
  105.         if (++list_it == table_it->end())
  106.         {
  107.                 do ++table_it; while (table_it != table_end && !table_it->size());
  108.                 if (table_it != table_end)
  109.                         list_it = table_it->begin();
  110.         }
  111.         return *this;
  112. }
  113.  
  114. HashTable::iterator& HashTable::iterator::operator--()
  115. {
  116.         if (table_it == table_begin && list_it == table_begin->begin()) return *this;
  117.         if (list_it != table_it->begin())
  118.                 --list_it;
  119.         else
  120.         {
  121.                 do --table_it; while (table_it != table_begin && !table_it->size());
  122.                 list_it = table_it->size() ? --table_it->end() : table_it->begin();
  123.         }
  124.         return *this;
  125. }
  126.  
  127. void HashTable::Add(const string& s)
  128. {
  129.         hash_value_type hash = hasher(s, table.size());
  130.         for (list < string >::iterator it = table[hash].begin(); it != table[hash].end(); ++it)
  131.                 if (*it == s)
  132.                         return;
  133.         table[hash].push_back(s);
  134.         ++n;
  135.         rebuild();
  136. }
  137.  
  138. bool HashTable::Contain(const string& s)
  139. {
  140.         hash_value_type hash = hasher(s, table.size());
  141.         for (list < string >::iterator it = table[hash].begin(); it != table[hash].end(); ++it)
  142.                 if (*it == s)
  143.                         return true;
  144.         return false;
  145. }
  146.  
  147. void HashTable::Delete(const string& s)
  148. {
  149.         hash_value_type hash = hasher(s, table.size());
  150.         for (list < string >::iterator it = table[hash].begin(); it != table[hash].end(); ++it)
  151.                 if (*it == s)
  152.                 {
  153.                         table[hash].erase(it);
  154.                         --n;
  155.                         break;
  156.                 }
  157.         rebuild();
  158. }
  159.  
  160. void HashTable::rebuild()
  161. {
  162.         if (table.size() <= n * 4 && n * 2 <= table.size())
  163.                 return;
  164.         vector < string > data;
  165.         for (hash_iterator_type it = begin(); it != end(); ++it)
  166.                 data.push_back(*it);
  167.         int nn = table.size() > n * 4 ? n / 2 : n * 2;
  168.         hasher.next_hash();
  169.         table.assign(nn, list < string > ());
  170.         int cur_hash;
  171.         for (vector < string >::iterator it = data.begin(); it != data.end(); ++it)
  172.         {
  173.                 cur_hash = hasher(*it, nn);
  174.                 table[cur_hash].push_back(*it);
  175.         }
  176. }
  177.  
  178. int main()
  179. {
  180.         string s;
  181.         HashTable ht;
  182.         HashTable::iterator it = ht.begin();
  183.         ht.Add("pumpururum");
  184.         ht.Add("12345");
  185.         ht.Add("80931283");
  186.         ht.Add("uieiuf");
  187.         cout << ht.Size() << endl;
  188.         system("pause");
  189.         return 0;
  190. }
  191. Hide details
  192. Change log
  193. r94 by breakneck11@gmail.com on Oct 15 (4 days ago)   Diff
  194. [No log message]
  195. Go to:  
  196. Double click a line to add a comment
  197. Older revisions
  198.  r86 by breakneck11@gmail.com on Oct 15 (4 days ago)   Diff
  199. All revisions of this file
  200. File info
  201. Size: 6885 bytes, 190 lines
  202. View raw file
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement