【问题标题】:Calculate function time complexity计算函数时间复杂度
【发布时间】:2018-04-27 09:22:58
【问题描述】:

我正在尝试计算这个函数的时间复杂度

代码

int Almacen::poner_items(id_sala s, id_producto p, int cantidad){
it_prod r = productos.find(p);
if(r != productos.end()) {
    int n = salas[s - 1].size();
    int m = salas[s - 1][0].size();
    for(int i = n - 1; i >= 0 && cantidad > 0; --i) {
        for(int j = 0; j < m && cantidad > 0; ++j) {
            if(salas[s - 1][i][j] == "NULL") {
                salas[s - 1][i][j] = p;
                r->second += 1;
                --cantidad;
            }
        }
    }
}
else {
    displayError();
    return -1;
}
return cantidad;

}

变量productos是一个std::map,它的find方法的时间复杂度是Olog(n),其他变量salas是一个std::vector。 我计算了时间,发现它是 log(n) + nm 但不确定它是否是正确的表达式,或者我应该将其保留为 nm 因为它是最差的,或者如果我只使用 n²。

谢谢

【问题讨论】:

    标签: time-complexity


    【解决方案1】:

    整体函数为 O(nm)。 Big-O 表示法是关于“在大值的限制”(并忽略常数因素)。 “小”开销(如 O(log n) 查找,甚至 O(n log n) 排序)被忽略。

    实际上,O(n log n) 排序情况稍微复杂一些。如果您期望 m 通常与 n 大小相同,则 O(nm + nlogn) == O(nm),如果您期望 n ≫ m,则 O(nm + nlogn) == O(nlogn)。

    顺便说一句,这不是关于 C++ 的问题。

    【讨论】:

      【解决方案2】:

      通常在使用大 O 表示法时,将所有变量取为无穷大时,您只留下最主要的项。

      n 本身在无穷远处比log n 大得多,所以即使没有m,您也可以(并且通常应该)删除log n 术语,所以O(nm) 对我来说看起来不错。

      在非理论用例中,了解实际复杂性有时很重要(对于非无限输入),因为有时在无穷大时速度较慢的算法可以为较短的输入产生更好的结果(有一些示例 O( 1)算法具有如此可怕的常数,以至于指数算法在现实生活中做得更好)。快速排序被认为是 O(n^2) 算法的一个实际示例,该算法通常比 O(n log n) 算法做得更好。

      阅读“Big O Notation”了解更多信息。

      【讨论】:

        【解决方案3】:

        k = productos.size()
        n = salas[s - 1].size()
        m = salas[s - 1][0].size()
        

        您的算法是 O(log(k) + nm)。您需要为每个自变量使用不同的名称

        现在,knm 之间可能存在关系,您可以使用减少的变量集重新标记,但这从您的代码中无法辨别,您需要了解数据。

        也可能是其中一些项不会变大,在这种情况下它们实际上是常数,即 O(1)。

        例如你可能知道k &lt;&lt; nk &lt;&lt; mn ~= m,这可以让你将其描述为O(n^2)

        【讨论】:

        • 没有关系,但 k 与 m 和 n 相比相当小
        猜你喜欢
        • 1970-01-01
        • 2021-02-18
        • 2022-01-04
        • 2015-09-26
        • 1970-01-01
        • 2021-03-03
        • 1970-01-01
        相关资源
        最近更新 更多