[CareerCup] 8.10 Implement a Hash Table 实现一个哈希表
生活随笔
收集整理的這篇文章主要介紹了
[CareerCup] 8.10 Implement a Hash Table 实现一个哈希表
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
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; };?
總結
以上是生活随笔為你收集整理的[CareerCup] 8.10 Implement a Hash Table 实现一个哈希表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 统计abacbacdadbc中的每个字母
- 下一篇: 控件UI性能调优 -- SizeChan