[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,如需转载请自行联系原博主。

相关文章
|
10月前
|
数据采集 缓存 定位技术
网络延迟对Python爬虫速度的影响分析
网络延迟对Python爬虫速度的影响分析
|
7月前
|
计算机视觉 Perl
RT-DETR改进策略【Backbone/主干网络】| 替换骨干网络为CVPR-2024 PKINet 获取多尺度纹理特征,适应尺度变化大的目标
RT-DETR改进策略【Backbone/主干网络】| 替换骨干网络为CVPR-2024 PKINet 获取多尺度纹理特征,适应尺度变化大的目标
191 10
RT-DETR改进策略【Backbone/主干网络】| 替换骨干网络为CVPR-2024 PKINet 获取多尺度纹理特征,适应尺度变化大的目标
|
10月前
|
敏捷开发 供应链 数据可视化
如何利用精益生产管理工具提升项目执行力?推荐7款必备工具
本文介绍了七款精益生产管理工具,包括板栗看板、LeanKit、Targetprocess、Miro、Smartsheet、Airtable 和 LiquidPlanner,详细阐述了各工具的功能亮点及其在不同行业的应用,旨在帮助企业提高效率、减少浪费、优化流程,实现项目管理的持续改进。
如何利用精益生产管理工具提升项目执行力?推荐7款必备工具
|
机器学习/深度学习 数据采集 算法
深度解析Python中的机器学习库:Scikit-learn
深度解析Python中的机器学习库:Scikit-learn
325 0
|
11月前
|
云安全 机器学习/深度学习 人工智能
阿里云WAAP安全产品能力获IDC评测七项满分,市场份额第一
IT市场研究和咨询公司IDC发布《中国WAAP厂商技术能力评估,2024》和《中国云Web应用防火墙市场份额,2023》报告:阿里云凭借领先的WAAP安全产品性能,在IDC评测报告中成为唯一7项能力全部满分的厂商,并在中国云WAF市场份额、中国公有云WAF市场份额中,均以绝对优势位居第一,获得技术能力和市场双认可。
|
12月前
|
存储 安全 测试技术
如何评估 API 的质量
本文详细介绍了评估API质量的关键指标,包括功能性(功能完整性与准确性)、可靠性(稳定性和错误处理)、性能(响应时间和吞吐量)、易用性(文档质量和接口设计)及安全性(身份验证和数据加密),并提供了具体评估方法与测试建议,帮助开发者全面衡量API质量。通过这些评估,可以确保选择到高质量的API,为软件项目奠定坚实基础。
360 5
|
消息中间件 存储 物联网
|
机器学习/深度学习 人工智能 自然语言处理
AI在创造还是毁掉音乐?——探索人工智能对音乐创作的影响
在当今数字化时代,人工智能(AI)技术的快速发展不仅改变了我们的生活方式和工作方式,也在音乐创作领域引发了广泛的讨论和热议。最近,随着各类音乐生成AI模型的涌现,人们开始探讨AI在音乐创作中的作用,以及它对传统音乐产业的潜在影响。
831 5
|
运维 监控 Devops
云效DevOps:让团队协作更高效、更和谐
【6月更文挑战第11天】云效DevOps助力企业提升竞争力,通过自动化、持续集成和部署,实现开发运维无缝协作,降低沟通成本。自动化流程减少人为错误,提高软件交付速度和质量。实时反馈机制促进持续改进,确保团队高效、和谐运作,提供更稳定可靠的软件开发运维体验。
206 3