【问题标题】: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;
        }
}

【问题讨论】:

    标签: c++ hashmap unordered-map


    【解决方案1】:

    文档说,std::unordered_map::find() 的复杂度为

    平均恒定,最坏情况与容器大小呈线性关系。

    所以你得到了 O(n) 的平均复杂度和 O(n^2) 的最坏情况复杂度。

    附录: 由于您使用整数作为键并且没有自定义哈希函数,我认为假设 find 的 O(1) 是安全的,因为您可能不会遇到最坏的情况。

    【讨论】:

    • 你能提供一个更好的方法,在最坏的情况下需要 O(n) 吗?
    • @sanjanamukherjee 答案是正确的,但您的方法也可以保持 O(n) 复杂性来解决,例如面试问题。可以假设哈希映射操作是 O(1)。
    猜你喜欢
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    • 2016-10-30
    • 2013-10-05
    • 2015-03-31
    • 2022-11-14
    • 2022-01-13
    相关资源
    最近更新 更多