Mahmoud_Hawara

Hash Table (Separate Chain)

Nov 20th, 2025
270
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.02 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. using namespace std;
  4.  
  5. class HashTable {
  6. private:
  7.    
  8.     const int P = 127;
  9.     const float LOAD_FACTOR_LIMIT = 0.75;
  10.    
  11.     vector<list<pair<string, int>>> table;
  12.     int numberOfBuckets, numberOfElements;
  13.  
  14.     int Add(int a, int b) {
  15.         return (a + b) % numberOfBuckets;
  16.     }
  17.  
  18.     int mul(int a, int b) {
  19.         return 1ll * a * b % numberOfBuckets;
  20.     }
  21.  
  22.     int Hash(string s) {
  23.         int pow = 1;
  24.         int h = 0;
  25.         for (int i = 0; s[i]; i++) {
  26.             h = Add(h, mul(s[i], pow));
  27.             pow = mul(pow, P);
  28.         }
  29.         return h;
  30.     }
  31.  
  32.     void rehash() {
  33.         numberOfBuckets *= 2;
  34.         vector<list<pair<string, int>>> newTable(numberOfBuckets);
  35.         for (auto lst : table) {
  36.             for (auto x : lst) {
  37.                 int bucketNumber = Hash(x.first);
  38.                 newTable[bucketNumber].push_back({x.first, x.second});
  39.             }
  40.         }
  41.         table = newTable;
  42.     }
  43.  
  44.     void update(string key, int val) {
  45.         int bucketNumber = Hash(key);
  46.         auto &lst = table[bucketNumber];
  47.         for (auto it = lst.begin(); it != lst.end(); it++) {
  48.             if ((*it).first == key) {
  49.                 (*it).second = val;
  50.                 return;
  51.             }
  52.         }
  53.     }
  54.  
  55. public:
  56.     HashTable() {
  57.         numberOfBuckets = 8;
  58.         table.resize(numberOfBuckets);
  59.         numberOfElements = 0;
  60.     }
  61.  
  62.     void insert(string key, int value) {
  63.         if (get(key)) {
  64.             update(key, value);
  65.             return;
  66.         }
  67.         float currentLoadFactor = 1.0 * numberOfElements / numberOfBuckets;
  68.         if (currentLoadFactor >= LOAD_FACTOR_LIMIT) rehash();
  69.         int bucketNumber = Hash(key);
  70.         table[bucketNumber].push_back({key, value});
  71.         numberOfElements++;
  72.     }
  73.  
  74.     int get(string key) {
  75.         int bucketNumber = Hash(key);
  76.         auto &lst = table[bucketNumber];
  77.         for (auto it = lst.begin(); it != lst.end(); it++) {
  78.             if ((*it).first == key) return (*it).second;
  79.         }
  80.         return 0;
  81.     }
  82.  
  83.     void addOne(string key) {
  84.         insert(key, get(key) + 1);
  85.     }
  86.  
  87.     void remove(string key) {
  88.         int bucketNumber = Hash(key);
  89.         auto &lst = table[bucketNumber];
  90.         for (auto it = lst.begin(); it != lst.end(); it++) {
  91.             if ((*it).first == key) {
  92.                 lst.erase(it);
  93.                 numberOfElements--;
  94.                 return;
  95.             }
  96.         }
  97.     }
  98.  
  99.     int size() {
  100.         return numberOfElements;
  101.     }
  102.  
  103.     bool empty() {
  104.         return numberOfElements == 0;
  105.     }
  106.  
  107.     void print() {
  108.         for (int i = 0; i < numberOfBuckets; i++) {
  109.             cout << i << ":\t";
  110.             for (auto x : table[i]) {
  111.                 cout << '(' << x.first << ", " << x.second << ") -> ";
  112.             }
  113.             cout << "NULL\n";
  114.         }
  115.         cout << "\t===============================================\n\n";
  116.     }
  117. };
  118.  
  119. int main()
  120. {
  121.  
  122.     return 0;
  123. }
Advertisement
Add Comment
Please, Sign In to add comment