C ++中的哈希表

时间:2012-10-12 20:40:32

标签: c++ map hashtable

C ++ std::map O(log n)的插入/删除/查找时间是?是否可以实现O(1)哈希表?

3 个答案:

答案 0 :(得分:14)

  

C ++映射的插入/删除/查找时间是否为O(log n)?

  

是否可以实现O(1)哈希表?

当然。标准库还提供了一个std::unordered_map

答案 1 :(得分:6)

C ++有unordered_map类型。 STL还包含hash_map类型,但这不在C ++标准库中。

现在,对于一些算法理论。可以在完美条件下实现O(1)哈希表,并且在技术上,哈希表是O(1)插入和查找。在这种情况下,完美的条件是哈希函数必须是完美的(即无冲突),并且你有无限的存储空间。

在实践中,让我们采取一个愚蠢的哈希表。对于任何输入键,它返回1.在这种情况下,当发生冲突时(即在第二次和后续插入时),它将必须进一步链接以找到一些空闲空间。它可以转到下一个存储位置,也可以使用链接列表。

在任何情况下,在最好的情况下,是的,哈希表是O(1)(当然,直到你已经耗尽了所有的哈希值,因为具有无限量输出的哈希函数是不切实际的)。在最坏的情况下(例如,使用我完全哑的哈希函数),哈希表是O(n),因为你必须遍历存储以便从给定的哈希中找到你的实际值,因为初始值不是正确的价值。

答案 2 :(得分:1)

std::map的实现是一棵树。这不是标准中直接指定的,但正如一些好书所说:"It is difficult to imagine that it can be anything else"。这意味着地图的插入/删除/查找时间为 O(log n)

经典哈希表的查找时间 O(n / num_slots)。一旦表格中预期的项目数与广告位数相比,您就会saturated O(1)