Unordered_Map查找时间

时间:2014-08-23 01:08:27

标签: performance hashmap hashtable unordered-map multimap

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

1 个答案:

答案 0 :(得分:10)

你的说法不对:

  • mapsetmultimapmultiset通常实现为二叉树(例如:在VS中实现为红黑树),此处的查找方法case使用在一个节点中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)(散列给出放置元素的桶,如果桶中的elem很少,则在目标elem之间搜索)。最糟糕的情况是,在这种情况下,所有元素都在同一个存储桶中,目标元素的搜索需要遍历存储桶中的所有元素,直到找到或不存在(在 O(n)中)。通过良好的散列函数,您可以增加分配到桶中elem的可能性(获得预期的恒定时间)。

注意:find函数返回iterator并不代表使用迭代器搜索请求的元素。