int sum = 0;
for (int n = N; n > 0; n /= 2)
for(int i = 0; i < n; i++)
sum++;
int sum = 0;
for (int i = 1 i < N; i *= 2)
for (int j = 0; j < i; j++)
sum++;
int sum = 0;
for (int i = 1 i < N; i *= 2)
for (int j = 0; j < N; j++)
sum++;
我已经忍受了很多时间。我仍然是二年级学生,但是我仍然无法计算算法的复杂性。我该如何计算?我觉得自己很无能,因为我似乎从来没有得到过!
例如,for循环的复杂度是否总是N?怎么知道您能推荐我可以阅读的任何资源吗?有视频吗?
答案 0 :(得分:2)
第一个和第二个示例是相同的(就时间复杂度而言)。对于他们来说,时间复杂度为O(N)。为什么。让我们计算一下。对于第一个示例,您的内部循环运行N次,然后运行N / 2次,然后运行N / 4并上升到1。因此,时间复杂度为O(N + N / 2 + N / 4 + .. + 1 ),此GP的总和为(2n-1)。因此,第一种情况的时间复杂度为 O(N)。
对于第二个示例,您的内部循环运行1次,然后运行2次,运行4次,直至达到N。因此,时间复杂度为O(1 + 2 + 4 + ... + N)和该GP的值为2 log(N + 1) -1,它等于N。因此,第二种情况的时间复杂度也是 O(N)。< / p>
对于第三个示例,第一个循环运行log(N)次,内部循环运行N次,由于它们各自独立,因此所需的时间复杂度为 O(NlogN)。 (所有计算均为近似值,所有对数为2)
好吧,要了解for循环的时间复杂度,您必须查看为“ i”分配了一个值(可以相同或不同)的次数。
要了解时间复杂度,请查看hackerearth资料,每次编写算法时,请尝试计算其时间复杂度。它是学习和检查Masters定理中递归关系的最佳方法,但也了解其基本知识。
答案 1 :(得分:1)
资源
https://www.geeksforgeeks.org/analysis-of-algorithms-set-4-analysis-of-loops/
说明
通常的想法是,循环的复杂度意味着将运行的次数。因此,for(int i = 0; i <10; i ++)的循环的复杂度为O(n),其中n = 10。如果存在多个循环(未嵌套),则代码的复杂度将为最高n。如果循环是嵌套的(如您在上面的第三个示例中所示),则两个循环的极限N都会相乘。使复杂度为O(N平方)。 (这是一个总体思路,而不是确切的定义!)
答案 2 :(得分:0)
此previous question可能会有所帮助,因为有几种不同的方法可以计算算法的复杂性,并且有很多好的资源。
以您的示例为例,for循环的复杂性可能并不总是N。
例如,以下代码段是线性的(时间复杂度为N),因为它从每次迭代i = 0依次到i = N,
for (int i = 0; i < N; i++) {
sum++;
}
此代码段的时间复杂度是对数的,因为我没有按顺序进行从0到N的每个值,而是乘以2。
for (int i = 0; i < N; i*2) {
sum++;
}