[CareerCup] 8.10 Implement a Hash Table 實現一個雜湊表

Grandyang發表於2015-09-16

 

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;
};

 

相關文章