我即将面试,正在查看一些技术面试问题,我遇到了this one。它要求哈希映射的插入和删除功能的时间复杂度。共识似乎是时间复杂度为O(1),如果有地图均匀分布,而O(n)如果它们都在同一个池中。
我想我的问题是哈希映射究竟是如何存储在内存中的?这两起案件将如何发生?
答案 0 :(得分:1)
链接页面上的一个答案是:
如果即使没有正确分配,插入总是O(1)(如果我们 在碰撞时制作链表)但删除最差的是O(n) 情况下。
这不是一个好的答案。对散列映射的时间复杂度的一般化答案将与Wikipedia article on hash tables:
类似Time complexity
in big O notation
Average Worst case
Space O(n) O(n)
Search O(1) O(n)
Insert O(1) O(n)
Delete O(1) O(n)
要解决你的问题哈希映射是如何存储在内存中的:有许多"桶和#34;以平均情况存储值,但在发生哈希冲突时必须扩展为某种列表。哈希表的好解释是维基百科文章this SO question和this C++ example.
上面的时间复杂度表是这样的,因为在一般情况下,哈希映射只是查找并存储单个值,但是在最坏的情况下,冲突会使所有元素共享O(n),其中所有元素共享一个桶和行为类似于您为该案例选择的列表实现。
请注意,有一些专门的实现来解决这里最糟糕的情况,也在维基百科文章中有所描述,但每个都有其他缺点,所以你必须为你的用例选择最好的。