繁体   English   中英

确定算法的时间复杂度

[英]Determine the time complexity of an algorithm

我正在读一本很酷的书,其中有一项任务是确定代码在最坏情况下的时间复杂度。 代码执行integer除法(a > 0, b > 0):

int div(int a, int b) {
    int count = 0;
    int sum = b;
    while (sum <= a) {
        sum += b;
        count++;
    }
        
    return count;
}

我的答案是 O(n),因为在最坏的情况下,当我们有 a > 0,b = 1 时,我们将在while()循环中迭代a次。

书中的答案是 O(a/b),这是有道理的。 但是,如果我们考虑最坏的情况,那么

O(a/1) => O(a) <=> O(n) (在这种情况下括号中的字母并不重要)。

所以,答案 O(n) 也是正确的。 不是吗?

你的回答没有意义,原因很简单,问题陈述中没有 n,说 a 是 n 是“作弊”。

此外,虽然它在技术上是正确的,但当您知道该算法恰好进行 a/b 加法时,使用不紧束缚的 O(a) 有点令人难过。


顺便说一句,说 b=1 是“最坏”情况是一个武断的决定。 最好说固定 a(和变量 b)或固定 b(和变量 a)的最坏情况。

唉,没有将 big-O 推广到多变量,请参阅Formal definition of big-O when multiple variables are involved? .

但是正如您知道确切的复杂性,T(a,b)=a/b,不需要最坏情况……当我们不知道如何计算确切的复杂性时,我们使用最坏情况分析。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM