C++中的哈希表

Hash table in C++

本文关键字:哈希表 C++      更新时间:2023-10-16

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)。一旦表中预期的项目数与插槽数相比较,就会得到saturatedO(1)