这段代码的时间复杂度?

时间:2018-03-15 07:41:46

标签: time-complexity

所以这些是我必须找到时间复杂度的for循环,但我并不清楚如何计算。

for (int i = n; i > 1; i /= 3) {
    for (int j = 0; j < n; j += 2) {
    ... ...
    }
    for (int k = 2; k < n; k = (k * k) {
    ...
    }
}

对于第一行,(int i = n; i&gt; 1; i / = 3),保持潜水i为3,如果i小于1则循环停在那里,对吧?

但那时间复杂度是多少?我认为这是n,但我不太确定。我认为它是n的原因是,如果我假设n是30然后我会像30,10,3,1那么循环停止。它运行了n次,不是吗?

对于最后一个for循环,我认为它的时间复杂度也是n,因为它的作用是

k从2开始并保持自身相乘直到k大于n。

因此,如果n为20,则k将为2,4,16然后停止。它也运行了n次。

我真的不认为我理解这类问题,因为时间复杂度可以是log(n)或n ^ 2等,但我看到的只有n。

我真的不知道什么时候记录或正方形。或其他任何事情。

我认为每个for循环运行n次。如何记录日志或方块?

任何人都可以帮我理解这个吗?请。

1 个答案:

答案 0 :(得分:1)

如果您想计算算法的时间复杂度,请在此处阅读以下文章:How to find time complexity of an algorithm

也就是说,您对算法复杂性的思考方式是小而线性的。它有助于在数量级上考虑它,然后以这种方式绘制它。如果你采取:

x, z = 0
for (int i = n; i > 1; i /= 3) {
    for (int j = 0; j < n; j += 2) {
    x = x + 1
    }
    for (int k = 2; k < n; k = (k * k) {
    z = z + 1
    }
}

并且在图表上绘制x和z,其中n从1开始 - > 10 - &gt; 100 - &gt; 1000 - &gt; 10 ^ 15左右,你会得到一个看起来像n ^ 2图的答案。在分析算法复杂度时,您主要对最大次数感兴趣,无论是最差还是最常见的情况,您的输入都是通过省略常量来循环的。所以在这种情况下,我希望你的算法是O(n ^ 2)

如需进一步阅读,我建议https://en.wikipedia.org/wiki/Introduction_to_Algorithms;它并不容易,但深入探讨了这一点。