这个特定代码的时间复杂度是多少?

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)。

以上是关于这个特定代码的时间复杂度是多少?的主要内容,如果未能解决你的问题,请参考以下文章

在 MongoDB 中,查找所有行 ID 不在给定列表中的记录的查询时间复杂度是多少?

这个检测循环链表的函数的时间复杂度是多少?

我的解决方案的时间复杂度是多少?

这个算法的时间复杂度是多少

这个用于计算指数的递归代码的运行时间是多少?

解决这个问题的时间复杂度是多少?