迭代 unordered_map 的复杂度是多少

问题描述

遍历使用链式散列实现的 unordered_map 的复杂度是多少?具体来说,这是否涉及遍历所有桶,在这种情况下,复杂度是 O(Buckets + NElements) 与理想的,例如O(NElements)

解决方法

迭代 unordered_map 的复杂度是多少?

O(N) 其中 N 是存储的元素数。标准的most relevant part

迭代器的所有类别只需要那些可以在恒定时间(摊销)内为给定类别实现的函数。因此,迭代器的需求表没有复杂性列。

您可以在例如this answer

..使用散列和链式实现?

所有无序映射都使用带有链接的散列 - 参见 here

具体来说,这是否涉及遍历所有桶,在这种情况下,复杂度是 O(Buckets + NElements) 与理想情况,例如O(N 个元素)

它实现了您所说的“理想”。在 GCC 的情况下,bucket 将迭代器保存到一个单链表中,并且在迭代容器时遍历通常较短的列表。通常是因为即使不更改默认的 max_load_factor() 1.0,桶的数量也可能与元素的数量完全相等 - 超过这个数量的元素将触发调整大小。但是,当几乎所有元素都被删除时,迭代的 big-O 效率变得更加重要,因为桶的数量不会自动向下调整(即减少)。