如何分析此算法的时间复杂度?

时间:2017-01-24 23:42:34

标签: algorithm time-complexity

嵌套循环的时间复杂度

for (i=1; i<=n; i++) {
    for (j=1; j<=log(i); j++) {
        O(1);
    }
}

其中n由用户提供?时间复杂度仅取决于循环变量还是条件<=

2 个答案:

答案 0 :(得分:0)

时间复杂度通常与用户输入无关(在这种情况下:n)。 第一个循环将执行n次迭代,第二个循环将在最坏的情况下执行log(n)次迭代。 由于你没有提供循环体,假设循环中的操作是O(1),那么复杂度是O(n log n)。

关于你的第二个问题,它取决于你的循环和“比较部分”(循环体)。

答案 1 :(得分:0)

时间复杂度取决于花费时间的所有内容,所以是的,它取决于for循环的范围。它通常最好从内到外分析循环。所以

    for (j=1; j<=log(i); j++) {
        O(1);
    }

将花费O(1)*log(i)=O(log(i))时间。然后我们可以将整个循环写为

for (i=1; i<=n; i++) {
    O(log(i));
}

此时最简单的方法就是将其全部添加。因此总时间是:

 O(log(1))+O(log(2))+O(log(3))+...+O(log(n-2))+O(log(n-1))+O(log(n))
=O(log(1) +  log(2) +  log(3) +...+  log(n-2) +  log(n-1) +  log(n))

由于对数的属性,这是O(log(n!)),而Stirling’s approximation则是O(n log(n))