这个特定代码的时间复杂度是多少?
Posted
技术标签:
【中文标题】这个特定代码的时间复杂度是多少?【英文标题】:What is the time complexity of this particular code? 【发布时间】:2019-10-10 08:49:19 【问题描述】:我创建了一个简单的程序,该程序使用无序映射来保持数组中元素的计数。我想知道下面程序的时间复杂度。 它只是 O(n) 时间吗? 在无序地图上完成的操作需要多少时间? (即在地图中查找一个键,如果它存在,则将其值递增 1,如果不将键初始化为 1) 这是在恒定时间内完成的,还是在一些对数或线性时间内完成的? 如果不是固定时间,请建议我一个更好的方法。
#include <unordered_map>
#include<iostream>
int main()
int n;
std::cin >> n;
int arr[100];
for(int i=0;i<n;i++)
std::cin >> arr[i];
std::unordered_map<int, int> dp;
for(int i=0; i<n; i++)
if (dp.find(arr[i]) != dp.end())
dp[arr[i]] ++;
else
dp[arr[i]] = 1;
【问题讨论】:
【参考方案1】:文档说,std::unordered_map::find()
的复杂度为
平均恒定,最坏情况与容器大小呈线性关系。
所以你得到了 O(n) 的平均复杂度和 O(n^2) 的最坏情况复杂度。
附录:
由于您使用整数作为键并且没有自定义哈希函数,我认为假设 find
的 O(1) 是安全的,因为您可能不会遇到最坏的情况。
【讨论】:
你能提供一个更好的方法,在最坏的情况下需要 O(n) 吗? @sanjanamukherjee 答案是正确的,但您的方法也可以保持 O(n) 复杂性来解决,例如面试问题。可以假设哈希映射操作是 O(1)。以上是关于这个特定代码的时间复杂度是多少?的主要内容,如果未能解决你的问题,请参考以下文章