Unordered_Map查找时间

Dar*_*i99 3 performance unordered-map hashtable hashmap multimap

C++库中的内置映射和集合(包括unordered_map和multimap)要求find函数(用于查找特定元素)使用迭代器来遍历元素.C++参考站点声称使用这些数据结构查找元素平均需要时间,就像常规哈希表一样.但是,迭代器是否必须遍历整个列表,在找到元素之前平均得到这个O(n)时间?

Net*_*peC 10

你的陈述不是真的:

  • map,set,multimapmultiset通常为二叉树(例如:在VS实现为红黑树)来实现,在这种情况下,find方法使用在一个节点的属性进行搜索的关键left child is less不是节点(根据比较器)和the right child is greater比节点(根据比较器).根据标准的要求,给出O(log n).
  • 在的情况下unordered_mapunordered_set被实现为哈希表,通常作为桶的集合实现的(例如:std::vector<Bucket>)和铲斗被实现为的元素的集合unordered_map(例如:std::vector<elem>或者std::list<elem>),假设散列函数是恒定的时间(或排除时间),此集合中的搜索是平均恒定时间O(1)(散列给出放置元素的桶,如果桶中搜索的元素很少,那么目标元素之间).最坏的情况是,在这种情况下,当所有元素都在同一个桶中时,目标元素的搜索将需要遍历桶中的所有元素,直到找到或不存在(在O(n)中).通过良好的散列函数,您可以在桶中增加足够均匀分裂的概率(获得预期的恒定时间).

注意:find函数返回一个iterator并不意味着使用迭代器来搜索请求的元素.

  • 在`unordered_map`和类似的情况下,搜索最多可以使用**O(n)**,但这是最糟糕的情况,通常需要**O(1)**,所有这些都取决于散列函数均匀分布的程度桶中的元素(目标是每个桶具有相同数量的元素,最差的是所有元素都在同一个桶中)._close_数据结构的实际状态越多_best O(1)_或_worst O(n)_ case,运行时越接近.通常接近最坏的情况不会发生太多(它需要结合非常糟糕的散列函数和奇怪的数据) (2认同)