确定这些不同循环的大 O 运行 次?
Determining the big-O run-times of these different loops?
确定这些不同循环的大 O 运行 次?
for i = 1 to n {
...
for j = 1 to 2*i {
...
k = j;
while (k>=0) {
...
k = k-1;
}
}
}
我发现答案是 O(n^3),因为三个循环相互嵌套,我的答案正确吗?
作为一种启发式方法,这是正确的,但这种启发式方法可能会让您误入歧途。可以找到内循环数的确切公式。
对于每个j,从j到0包含k 运行s,所以内循环是运行 j+1次。
对于从1到2*i的每个i,j运行s,所以内循环是运行1+1和2+1次i=1,然后也是3+ i=2 时 1 次和 4+1 次,依此类推。我希望你能看到,对于每个 i,内环比第 (2i+1) 个三角数少 运行 一个。第 n 个 triangular number 是 n(n+1)/2,所以对于每个 i,我们得到
的计数
(2i+1)(2i+1+1)/2 - 1
简化为
2 * i**2 + 3 * i
对于每个 n,i 运行s 从 1 到 n,所以我们只对从 1 到 n 的最后一个表达式求和。这给了我们前 n 个平方数的总和加上第 n 个三角数的三次之和的两倍。 the sum of the first n square numbers 的公式是
n**3/3 + n**2/2 + n/6
所以我们简化
2*(n**3/3 + n**2/2 + n/6) + 3*(n*(n+1)/2)
我们得到
2/3 * n**3 + 5/2 * n**2 + 11/6 * n
这显然是 O(n**3),所以您的启发式是正确的。
我用一些简单的 Python 代码检查了最后的表达式。
确定这些不同循环的大 O 运行 次?
for i = 1 to n {
...
for j = 1 to 2*i {
...
k = j;
while (k>=0) {
...
k = k-1;
}
}
}
我发现答案是 O(n^3),因为三个循环相互嵌套,我的答案正确吗?
作为一种启发式方法,这是正确的,但这种启发式方法可能会让您误入歧途。可以找到内循环数的确切公式。
对于每个j,从j到0包含k 运行s,所以内循环是运行 j+1次。
对于从1到2*i的每个i,j运行s,所以内循环是运行1+1和2+1次i=1,然后也是3+ i=2 时 1 次和 4+1 次,依此类推。我希望你能看到,对于每个 i,内环比第 (2i+1) 个三角数少 运行 一个。第 n 个 triangular number 是 n(n+1)/2,所以对于每个 i,我们得到
的计数(2i+1)(2i+1+1)/2 - 1
简化为
2 * i**2 + 3 * i
对于每个 n,i 运行s 从 1 到 n,所以我们只对从 1 到 n 的最后一个表达式求和。这给了我们前 n 个平方数的总和加上第 n 个三角数的三次之和的两倍。 the sum of the first n square numbers 的公式是
n**3/3 + n**2/2 + n/6
所以我们简化
2*(n**3/3 + n**2/2 + n/6) + 3*(n*(n+1)/2)
我们得到
2/3 * n**3 + 5/2 * n**2 + 11/6 * n
这显然是 O(n**3),所以您的启发式是正确的。
我用一些简单的 Python 代码检查了最后的表达式。