C++中的哈希表
Hash table in C++
C++的插入/删除/查找时间是std::map
还是O(log n)
?是否可以实现O(1)
哈希表?
C++映射的插入/删除/查找时间是O(log n)吗?
是。
是否可以实现O(1)哈希表?
当然。标准库还提供了一个std::unordered_map
。
C++具有unordered_map
类型。STL还包含一个hash_map
类型,尽管它不在C++标准库中。
现在,我们来谈谈算法理论。在完美的条件下实现O(1)哈希表是可能的,从技术上讲,哈希表是O(1的)插入和查找。这种情况下的完美条件是哈希函数必须是完美的(即无冲突),并且您有无限的存储空间。
在练习中,让我们取一个愚蠢的哈希表。对于任何输入键,它都返回1。在这种情况下,当发生碰撞(即第二次和随后的插入)时,它将不得不进一步连锁以找到一些空闲空间。它可以转到下一个存储位置,也可以为此使用链接列表。
在任何情况下,在最好的情况下,是的,哈希表是O(1)(当然,直到你用完了所有的哈希值,因为拥有一个输出量无限的哈希函数是不切实际的)。在最坏的情况下(例如,使用我的完全愚蠢的哈希函数),哈希表是O(n),因为你必须遍历存储才能从给定的哈希中找到你的实际值,因为初始值不是正确的值。
std::map
的实现是一个树。这在标准中没有直接规定,但正如一些好书所说:"It is difficult to imagine that it can be anything else"
。这意味着映射的插入/删除/查找时间O(logn)。
经典哈希表具有查找时间O(n/num_slot)。一旦表中预期的项目数与插槽数相比较,就会得到saturated
O(1)。
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 用C++将哈希表写入文件并从文件中恢复
- C++中的并发哈希表
- 在具有开放寻址的哈希表中插入节点 [优化逻辑]
- 与C++哈希表的基础知识混淆
- 调整大小和复制哈希表数组中的元素
- 带链接的基本哈希表
- C++哈希表中,两个相同的实现,但一个给出错误
- 如果索引不是整数,我们如何在 C++ 中插入哈希表
- 查找项目在哈希表中的位置
- 为什么C++ STL 哈希表 (unordered_map) 不接受向量作为键
- C++哈希表 - 如何解决自定义数据类型作为键的unordered_map冲突?
- 使用哈希表设置实现
- 同时写入和读取哈希表
- 在 C++ 中为特定哈希表创建插入函数
- 我可以比朴素哈希表更快地将随机字符串映射到两个类吗?
- 哈希表:船舶记录
- 使用rehash的C++哈希表问题
- 实现具有浮点键的类似哈希表的数据结构,其中公差内的值被合并在一起