我很难理解算法分析,尤其是以下示例:
for (int i = 1; i < n^3; i = 2*i){
for (int j = 6*n; j > 0; j = j-2){
}
}
所以我对此的理解是外部循环为O(nlogn)
,因为 i 乘以常量,我不确定n^3
是否为差异与否。
内圈让我最困惑。我认为O(n)
因为 j 会减少一定量,但我不确定6*n
和j > 0
是否有影响。
如果我正确,那么整个算法将是O(nlogn)
?不确定如何表达这个时间复杂度T(n)
。
非常感谢任何见解。
答案 0 :(得分:3)
外部循环不是O(nlogn)
- 因为i
在每个循环中乘以2,它变为:2,4,8,16,32 ...这意味着它将采用日志(n ^ 3)步骤i
达到n ^ 3(日志的基数为2)。
更正式:O(log(n^3)) = O(3logn) = O(logn)
在内循环中,j
初始化为6*n
,并以2为步长向下移动。这意味着j
达到零需要6n / 2步。< / p>
更正式:O(6n/2) = O(3n) = O(n)
因此代码部分的复杂性为O(n) * O(logn) = O(nlogn)