C ++库中的内置映射和集合(包括unordered_map和multimap)要求find函数(用于查找特定元素)使用迭代器来遍历元素。 C ++参考站点声称使用这些数据结构查找元素平均需要时间,就像常规哈希表一样。但是,迭代器是否必须遍历整个列表,在找到元素之前平均得到这个O(n)时间?
答案 0 :(得分:10)
你的说法不对:
map
,set
,multimap
和multiset
通常实现为二叉树(例如:在VS中实现为红黑树),此处的查找方法case使用在一个节点中left child is less
比节点(根据比较器)和the right child is greater
而不是节点(根据比较器)的属性搜索密钥。根据标准的要求,这会给出 O(log n)。unordered_map
和unordered_set
被实现为哈希表的情况下,通常实现为桶的集合(例如:std::vector<Bucket>
),并且桶被实现为元素的集合unordered_map
(例如std::vector<elem>
或std::list<elem>
),假设散列函数是恒定时间(或不包括时间),此集合中的搜索是平均恒定时间 O(1)(散列给出放置元素的桶,如果桶中的elem很少,则在目标elem之间搜索)。最糟糕的情况是,在这种情况下,所有元素都在同一个存储桶中,目标元素的搜索需要遍历存储桶中的所有元素,直到找到或不存在(在 O(n)中)。通过良好的散列函数,您可以增加分配到桶中elem的可能性(获得预期的恒定时间)。注意:find
函数返回iterator
并不代表使用迭代器搜索请求的元素。