8.10 Design and implement a hash table which uses chaining (linked lists) to handle collisions.
這道題讓我們實現一個簡單的雜湊表,我們採用了最簡單的那種取餘對映的方式來實現,我們使用Cell來儲存一對對的key和value的對映關係,然後每一個格子都用一個list連結串列來儲存所有的餘數為該格子序號的Cell,我們設定格子總數為10,然後我們用泛式程式設計來適用於所有的引數型別,然後實現雜湊表的基本存數和取數的功能。現在大多數的雜湊表都是用二叉搜尋樹來實現的,但是用BST的話取數就是不是O(1)的時間複雜度了(如果我們以後很多的collision的話),但是BST的好處就是省空間,不需要建立超大的陣列來儲存對映。
template<typename K, typename V> class Cell{ public: Cell(K k, V v): _key(k), _value(v) {} bool equivalent(Cell *c) { return equivalent(c->getKey()); } bool equivalent(K k) { return _key == k; } K getKey() { return _key; } V getValue() { return _value; } private: K _key; V _value; }; template<typename K, typename V> class Hash { public: Hash() { _items.resize(_MAX_SIZE); } int hashCodeOfKey(K key) { return sizeof(key).size() % _items.size(); } void put(K key, V value) { int x = hashCodeOfKey(key); if (_items[x] == nullptr) { _items[x] = new list<Cell<K, V>*> (); } list<Cell<K, V>*> *collided = _items[x]; for (auto a : *collided) { if (a->equivalent(key)) { collided->remove(a); break; } } Cell<K, V> *cell = new Cell<K, V>(key, value); collided->push_back(cell); } V get(K key) { V v; int x = hashCodeOfKey(key); if (_items[x] == nullptr) { return v; } list<Cell<K, V>*> *collided = _items[x]; for (auto a : *collided) { if (a->equivalent(key)) { return a->getValue(); } } return v; } private: const int _MAX_SIZE = 10; vector<list<Cell<K, V>*>*> _items; };