我在算法课程中遇到了一些问题。
如何计算以下算法的时间复杂度:
我尝试使用常数而不是n
,并尝试了解其复杂性
但我发现自己对Big O问题感到非常困惑。
x=0;
for(i=0;i<n*n;i++)
for(j=0;j<i;j++)
x=x+i;
我想知道解决问题的步骤,以便我可以解决这些问题。
答案 0 :(得分:3)
渐近大O表示法中代码的时间复杂度为O(n ^ 4)。实际操作次数('x = x + 1')将接近((n ^ 4)/ 2)次。让我为你分解,第一个循环执行完全n ^ 2次,并且对于它的每个迭代,嵌套循环将迭代i次。所以在最坏的情况下它(第二个循环)将执行n ^ 2次。总计,它变为O(n ^ 4)。
答案 1 :(得分:3)
最好的办法是拿一支笔和一张纸,运行几个n
的值并尝试指明方向。然后,您执行以下操作:
对于n = 0
,内部循环不会被执行
对于n = 1
,内循环将执行1次
对于n = 2
,内循环将执行4次
对于n = 3
,内部循环将执行9次。
“外循环执行多少次?”
的 “n 2 ”
“内循环执行多少次?”
的 “n 2 ”
因此,您得出结论,时间复杂度为O(n 4 )。
答案 2 :(得分:0)
如果变量x
,i
和j
是无符号整数类型,则答案为O(1),因为两个循环最多可以执行有限次数。例如,如果变量是无符号整数,则为sqrt(UINT_MAX)
次。
如果变量是带符号的整数类型,则代码会为n
产生未定义的行为,其大小足以产生溢出,从而使问题无法回答。
如果将变量视为理想化变量,则可以精确计算执行x=x+i
语句的次数。
即,
0 + 1 + 2 + 3 + ... + (n^2 - 1)
这是(n^2 - 1) * (n^2) / 2
或(n^4)/2 - (n^2)/2
,即O(n ^ 4)。
答案 3 :(得分:0)
推断上述算法时间复杂度的正式步骤: