如何找到一系列算法的时间复杂度?
How to find the time complexity of a algorithm of a series ?
我怎样才能找到产生一系列求和的以下算法的复杂性。
系列:1+(1+2)+(1+2+3)+......+(1+2+3+...+n)
算法:
for(i=1; i<=n; i++){
for(j=1; j<=i; j++){
sum = sum + j;
}
}
要找到时间复杂度,让我们分析一下核心(循环内)有多少次运行。
外循环运行n次,所以复杂度至少O(n).
内部循环是运行
- 当 i=1 时一次
- 当 i=2
时两次
- ... 当 i=n
时 n 次
所以总的次数会运行是1到n之间的整数之和:(n * (n+1)) / 2 = n^2 / 2 + n / 2 , 即 O(n^2).
另一方面,Space complexity 在这种情况下更简单。由于内存要求不依赖于输入长度,space 上述算法的复杂度为 O(1)(意味着所需的内存量是相同的(基本上sum
) 的大小,与 n 无关,天气结果适合 sum
)。
请注意,对于相同的任务,不同的算法可能具有不同的复杂度。正如@AxelKemper 在他的评论中正确指出的那样,您可以将解决方案表示为 n 的单个多项式,因此最有效的解决方案将具有 O(1) 的复杂性。然而,上面的算法不是这样工作的,并且具有更高的复杂性。
总和
1+(1+2)+(1+2+3)+.......+(1+2+3+...+n)
等于
1/2(1+1) + 2/2(2+1) + 3/2(3+1)+.......+n/2(n+1)
这可以改写为
1/2(1+2+...+n) + 1/2(1+4+9+....+n*n)
这反过来导致[=19=]
n/4(n+1) + 1/12(2n^3 + 3n^2 + n)
可以简化为
n^3/6 + n^2/2 + n/3
忽略 n
的字长,计算此多项式的复杂度不取决于 n
。
因此问题的时间复杂度为O(1)
所示算法的时间复杂度为 O(n^2)
,如接受的答案中所述。
我怎样才能找到产生一系列求和的以下算法的复杂性。
系列:1+(1+2)+(1+2+3)+......+(1+2+3+...+n)
算法:
for(i=1; i<=n; i++){
for(j=1; j<=i; j++){
sum = sum + j;
}
}
要找到时间复杂度,让我们分析一下核心(循环内)有多少次运行。
外循环运行n次,所以复杂度至少O(n).
内部循环是运行
- 当 i=1 时一次
- 当 i=2 时两次
- ... 当 i=n 时 n 次
所以总的次数会运行是1到n之间的整数之和:(n * (n+1)) / 2 = n^2 / 2 + n / 2 , 即 O(n^2).
另一方面,Space complexity 在这种情况下更简单。由于内存要求不依赖于输入长度,space 上述算法的复杂度为 O(1)(意味着所需的内存量是相同的(基本上sum
) 的大小,与 n 无关,天气结果适合 sum
)。
请注意,对于相同的任务,不同的算法可能具有不同的复杂度。正如@AxelKemper 在他的评论中正确指出的那样,您可以将解决方案表示为 n 的单个多项式,因此最有效的解决方案将具有 O(1) 的复杂性。然而,上面的算法不是这样工作的,并且具有更高的复杂性。
总和
1+(1+2)+(1+2+3)+.......+(1+2+3+...+n)
等于
1/2(1+1) + 2/2(2+1) + 3/2(3+1)+.......+n/2(n+1)
这可以改写为
1/2(1+2+...+n) + 1/2(1+4+9+....+n*n)
这反过来导致[=19=]
n/4(n+1) + 1/12(2n^3 + 3n^2 + n)
可以简化为
n^3/6 + n^2/2 + n/3
忽略 n
的字长,计算此多项式的复杂度不取决于 n
。
因此问题的时间复杂度为O(1)
所示算法的时间复杂度为 O(n^2)
,如接受的答案中所述。