C ++ std::map
O(log n)
的插入/删除/查找时间是?是否可以实现O(1)
哈希表?
答案 0 :(得分:14)
答案 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)。