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

本文转自博客园Grandyang的博客,原文链接:实现一个哈希表[CareerCup] 8.10 Implement a Hash Table,如需转载请自行联系原博主。

相关文章
|
2月前
|
存储 负载均衡 算法
Hash介绍与应用详解
哈希算法在计算机科学中有着广泛而重要的应用,从数据存储、数据完整性校验到密码安全和分布式系统中的负载均衡,哈希函数都发挥着关键作用。通过本文的介绍和示例代码,希望您能更好地理解哈希的基本概念和实际应用,并在您的项目中有效地应用这些知识。
371 3
|
7月前
|
存储 缓存 搜索推荐
Hash Table
【6月更文挑战第12天】
37 1
|
8月前
|
存储 算法 Java
算法系列--哈希表
算法系列--哈希表
49 0
|
存储 算法
hash和hash tree
hash和hash tree
|
前端开发 JavaScript
hash、chunkhash和contenthash
webpack 通用配置优化
135 0
hash、chunkhash和contenthash
|
存储 算法 JavaScript
基础数据结构(四):哈希表 HashTable(TS版)
基础数据结构(四):哈希表 HashTable(TS版)
基础数据结构(四):哈希表 HashTable(TS版)
|
弹性计算 关系型数据库 测试技术
PostgreSQL 分区表如何支持多列唯一约束 - 枚举、hash哈希 分区, 多列唯一, insert into on conflict, update, upsert, merge insert
标签 PostgreSQL , 分区表 , native partition , 唯一 , 非分区键唯一 , 组合唯一 , insert into on conflict , upsert , merge insert 背景 PG 11开始支持HASH分区,10的分区如果要支持hash分区,可以通过枚举绕道实现。 《PostgreSQL 9.x, 10, 11 hash分区表 用法举例
3160 0
|
存储
Admiral(双向BFS + Hash)
Problem Description Suppose that you are an admiral of a famous naval troop. Our naval forces have got 21 battleships.
1144 0