You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

疑问:这段C++代码的首个unordered_map循环为何是O(n)?

关于unordered_map插入循环时间复杂度的疑问解答

首先贴出你提到的代码片段:

unordered_map<int,int> mymap;
for(int i = 0; i < nums.size(); i++){
    mymap[nums.at(i)]++;
}

priority_queue <pair<int,int>> maxheap;
for(auto it = mymap.begin(); it != mymap.end(); it++){
    maxheap.push({it->second,it->first});
}

vector<int> result;

for(int i = 0; i < k; i++){
    result.push_back(maxheap.top().second);
    maxheap.pop();
}

return result;

你提到的疑问核心在于平均复杂度和最坏复杂度的区别:

  • LeetCode标注的O(n)是平均时间复杂度。unordered_map基于哈希表实现,在平均情况下,单个元素的插入、查找操作时间复杂度是O(1),因此遍历n个元素并插入的循环,平均总时间复杂度为O(n),这是算法分析中最常用的评估维度。
  • 你考虑的O(n²)是最坏时间复杂度,这种情况仅当所有元素都发生哈希碰撞,哈希表退化成链表时才会出现。但实际中,C++标准库的unordered_map会通过优化哈希函数、动态扩容调整负载因子等方式,极大降低这种极端情况的发生概率,所以算法题场景下一般不会以此作为复杂度评估的标准。
  • 算法平台的复杂度标注默认采用平均情况分析,除非题目明确要求考虑最坏场景,因此LeetCode会将这个循环的时间复杂度标注为O(n)。

内容的提问来源于stack exchange,提问作者testing123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 04:59:57