我试图找出使用Big O表示法的for循环的复杂性。我之前在其他课程中已经完成了这个,但是这个比其他课程更严格,因为它是在实际的算法上。代码如下:
for(i=n ; i>1 ; i/=2) //for any size n
{
for(j = 1; j < i; j++)
{
x+=a
}
}
和
for(i=1 ; i<=n;i++,x=1) //for any size n
{
for(j = 1; j <= i; j++)
{
for(k = 1; k <= j; x+=a,k*=a)
{
}
}
}
我已经到了,第一个循环具有O(n)复杂度,因为它经过n次列表。至于第二个循环,我有点迷路! 感谢您在分析中提供的帮助。每个循环都在自己的空间中,它们不在一起。
答案 0 :(得分:2)
考虑第一个代码片段
for(i=n ; i>1 ; i/=2) //for any size n
{
for(j = 1; j < i; j++)
{
x+=a
}
}
指令x+=a
执行总共n + n/2 + n/4 + ... + 1
次。
G.P.的第一个log 2 n项的总和起始期n
和公共比率1/2
是(n(1-(1/2) log 2 n )) /(1/2)即可。因此,第一个代码片段的复杂性是 O(n)。
现在考虑第二个代码片段,
for(i=1 ; i<=n; i++,x=1)
{
for(j = 1; j <= i; j++)
{
for(k = 1; k <= j; x+=a,k*=a)
{
}
}
}
两个外部循环一起调用最里面的循环总共n(n+1)/2
次。最里面的循环最多执行log<sub>a</sub>n
次。因此,第二个代码片段的总时间复杂度为 O(n 2 log a n)。
答案 1 :(得分:1)
您可以按照以下方式正式继续:
片段1:
片段2 (Pochhammer,G-Function和Stirling的近似):
使用log(G(n))。
[片段2的更新] :
来自“DISCRETE LOOPS AND WORST CASE PERFORMANCE”出版物的一些增强,由Johann Blieberger博士(所有案例验证 a = 2 ):
其中:
因此,
答案 2 :(得分:0)
编辑:我同意第一个代码块是 O (n)
你通过跳过2递减外环i
,并且在内循环中你运行i
次,所以迭代次数将是两个小于或小于2的所有幂的总和。等于N但大于0,即n log(n)+1 - 1,所以 O (n)。
第二个代码块是 O (log a (n)n 2 ),假设a
是常量。< / p>
两个最外面的循环等于所有小于或等于n的数字之和,即n(n-1)/ 2,所以 O (n 2 )。最后,内部循环是小于n的上限的幂,即 O (log a n)。