使用链哈希实现动态哈希表
Implementation of dynamic hash table using chain hashing
我正在尝试使用链哈希实现一个动态哈希表(数组中的每个元素都是一个链表)。从复杂性的角度来看,我想知道以下哪种可能性更好:1.当数组已满时,我应该将数组大小增加一倍,这意味着每个链表至少有一个元素。2.当我总共有N个元素(在所有链表中)时,我应该将数组大小增加一倍,其中N是数组大小。
大量的散列表实现,包括C++标准中的几个(unordered_set,unordered_map)。
为了回答您的问题,当元素计数达到N时,最好将bin计数(内部数组)增加一倍。否则会更困难,也更耗时(查看是否所有bin都已满)。
您需要保留一个包含元素计数的成员。
您不需要担心用户使用像{ return 0;}
这样的糟糕哈希函数。
就复杂性而言,它们都是一样的。哈希表的复杂度是按平均情况分摊的O(1)给出的,因为一旦你有了一个好的哈希函数,哈希冲突就会归结为运气问题。不管你做什么,任何哈希表最坏的复杂度都是O(N)
也就是说,有用的实现基于负载因子来调整大小,负载因子是总元素和存储桶数量("数组大小")之间的比率。等到每个bucket至少有一个条目时,会经常导致次优行为。但是负载因子1(N个桶中的N个元素)可能太高;我见过的大多数实现默认为0.7左右(10个bucket有7个元素),并且通常让用户配置负载因子(请同时参阅C++和Java)。这是内存与速度的交易,哈希表通常都是关于速度的。通常,只有评测才会显示任何给定程序的正确值。
此外,尺寸不需要加倍。典型的vector
实现在每次调整大小时都会将其大小增加50%或70%,因为在真实世界的应用程序上进行的大规模测试表明,这是比加倍更好的速度/内存权衡。当然,类似的事情也适用于哈希表,尽管这也需要进行分析。
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 用C++将哈希表写入文件并从文件中恢复
- C++中的并发哈希表
- 在具有开放寻址的哈希表中插入节点 [优化逻辑]
- 与C++哈希表的基础知识混淆
- 调整大小和复制哈希表数组中的元素
- 带链接的基本哈希表
- C++哈希表中,两个相同的实现,但一个给出错误
- 如果索引不是整数,我们如何在 C++ 中插入哈希表
- 查找项目在哈希表中的位置
- 为什么C++ STL 哈希表 (unordered_map) 不接受向量作为键
- C++哈希表 - 如何解决自定义数据类型作为键的unordered_map冲突?
- 使用AVL树的动态哈希表的复杂性
- 使用链哈希实现动态哈希表
- 初始化哈希表的 stl 列表动态数组(单独链接)
- 使用动态分配的数组创建哈希表
- 转换静态哈希表到动态哈希表
- 没有动态分配的哈希表/映射实现
- 具有动态值的哈希表