What is the worst case scenario for an unordered_map?
我发现许多关于map和unordered_map的复杂性的帖子。 据说unordered_map具有最坏情况下的O(N)复杂度。 出于我的目的,我将输入像1 2 5 6 9 11 12..这样的排序值。 我需要插入或查找和删除一个值。 我将不得不非常频繁地执行插入/删除操作。 我想到了在所有情况下都使用log(n)复杂度的set。 然后我偶然发现了具有最佳O(1)复杂度的unordered_map。 但是我需要了解我的情景,我会面对unordered_map的最坏情况吗? 会发生什么情况?
编辑:就我而言,所有值都是唯一的。
-
您输入的整数有一个范围吗?
-
是的,最大为2 ^ 29。
-
算法没有数据结构的时间复杂度。
-
您可能会发现此链接很有趣-它讨论了由创建输入键引起的拒绝服务攻击,这些输入键将触发哈希表中的最坏情况。
unordered_map最坏的情况通常发生在哈希函数为映射中的每个插入产生冲突时。
我说"通常"是因为该标准仅指定了最坏情况下的复杂性,而不指定其发生的时间或方式,因此从理论上讲,您的问题的答案是它是由实现定义的。
由于所有值都是唯一的,并且显然是整数(表示很好的哈希,可能是最佳_,这又取决于实现),因此您不会遇到这种最坏情况。 insert / find / delete将为O(1),因此看起来是一个合理的选择。
-
"当散列函数产生冲突时"-听起来像散列函数孤立...要学究,是当散列函数映射到存储桶时(例如,可能是% bucket_count(),尽管我不认为这是强制性的)发生碰撞。例如,如果哈希函数产生相异的值,它们是bucket_count()的倍数,则它们可能会发生冲突。
-
是的,这就是为什么我的意思是,您将如何制定它?
取决于哈希算法的实现,使用unordered_map时,有序数据集可能最终导致大量冲突。 由于您的数据是有序的,因此使用树集可能会更有优势(假设您不希望添加重复数据。)
-
对于平衡树,您指的是哪个操作的O(n)最坏情况?不插入,删除或查找,所有这些都是O(log n)最坏的情况。
-
平衡良好的树将为您提供删除,插入和查找的平均复杂度为O(log n);最坏的情况仍然是n。但是,大多数时间操作将是O(log n)。 @Benjamin Lindley取决于树集的实现方式,它有时可能有o(n)时间。(例如bst)* bigocheatsheet.com
-
@ByteByter保证平衡树的实现(例如RB树或AVL树)是O(log n)最坏的情况。您的链接是这样的。
-
@Benjamin Lindley Agreed,我只是说,根据数据结构的编码方式,它可能会更糟。
-
@ByteByter:仅当其编码方式不再满足其声称的数据结构的定义时。但是在那种情况下,它可能比O(n)更糟糕。它可以是O(n ^ 2)或O(2 ^ n)。但是我们不会称其为平衡二叉树,因为它不能满足一棵树的性能要求。请注意,您所指的bst(我假设是链接中的一棵)是一棵不平衡的树。
-
@Benjamin Lindley是的,我想我不应该这么宽容地使用"平衡"这个词。