1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| #include <bits/stdc++.h> using namespace std;
struct Node{ int key; int value; Node(): key(-1), value(-1){} Node(int key, int value) : key(key), value(value) {} }; struct HashTable{ private: int size; vector<Node> table; const int EMPTY = -1; const int DELETED = -2; public: HashTable(int size): size(size), table(size){ for(int i = 0; i < size; ++i){ table[i].key = EMPTY; table[i].value = -1; } } int Get(int key){ if (size == 0) return -1; int h = key % size; if (h < 0) h += size; for(int i = 0; i < size; ++i){ int idx = (h + i) % size; if (table[idx].key == EMPTY) return -1; if (table[idx].key == key) return table[idx].value; } return -1; } int Set(int key, int value){ if (size == 0) return -1; int h = key % size; if (h < 0) h += size; int firstDeleted = -1; for(int i = 0; i < size; ++i){ int idx = (h + i) % size; if (table[idx].key == key){ table[idx].value = value; return 0; } if (firstDeleted == -1 && table[idx].key == DELETED){ firstDeleted = idx; } if (table[idx].key == EMPTY){ if (firstDeleted != -1) idx = firstDeleted; table[idx].key = key; table[idx].value = value; return 0; } } if (firstDeleted != -1){ table[firstDeleted].key = key; table[firstDeleted].value = value; return 0; } return -1; } int Delete(int key){ if (size == 0) return -1; int h = key % size; if (h < 0) h += size; for(int i = 0; i < size; ++i){ int idx = (h + i) % size; if (table[idx].key == EMPTY) return -1; if (table[idx].key == key){ int value = table[idx].value; table[idx].key = DELETED; table[idx].value = -1; return value; } } return -1; } };
|