以下嵌套循环依赖关系的时间复杂度是多少?
count=0;
for(i=1;i<=n;i*=5)
for(j=1;j<=i;j++)
count++;
根据我目前所了解的内容,内环将增加5的幂数,就像我在下面的表格中所描述的那样,即当i = 1,j = 1时,当i = 5,j = 5和等等。以下嵌套循环依赖关系的时间复杂度是多少?
i | 1 | 5 | 25 | 125 |
j | 1 | 5 | 25 | 125 |
这使j增加,如在5^0,5^1,5^2,5^3等等。使用高斯特技,1 + 2 + 3 + 4 ... + n =(n 2 + n)/ 2 = n 2/2 + n/2,这给出了5 ^((n 2 + n)/2)。
这是否使总运行时间O(log base(5)n)?
我们会考虑循环,其中内循环的迭代次数是独立于外环的指数值
然后我们会尽量的n
不同的情况,以找出正确的模式:
n = 5
外:1 5
内:
i = 1
:1次
i = 5
:5次
1 + 5 = 6次,k = 2
n = 25
外:1 5 25
内:
i = 1
:1次
i = 5
:5次
i = 25
:25倍
1 + 5 + 25 = 31次,k = 3
n = 125
外:1 5 25 125
内:
1 + 5 + 25 + 125 = 156次,k = 4
inn ER:
(1 + ... + n/5^2 + n/5^1 + n/5^0)
n(1/n + ... + 1/5^2 + 1/5^1 + 1/5^0)
n(1/5^k-1 + ... + 1/5^2 + 1/5^1 + 1/5^0)
O(n(1/5^k-1 + ... + 1/5^2 + 1/5^1 + 1/5^0))
= O(n)的
最后你可以从我们计算时间复杂度为为O(n)格局看。
链接,时间复杂度解决方案的论证与等比数列: https://justpaste.it/15fhs
这里不能直接应用公式1 + 2 + … + n = n(n+1)/2
。 5^0 + 5^1 + … + 5^m
和5^(0 + 1 + … + m)
是两个完全不同的东西。
该系列5^0 + 5^1 + … + 5^m
是geometric series。使用式应该是
类=>这意味着
5^0 + 5^1 + … 5^m = O(5^m)
。还请注意5 m = n。
这是错误的。你忽略了对数行为。 – gartenkralle
@gartenkralle你的意思是什么? – kennytm
总和不应该运行到(n-1)。它应该运行到log(n)。由于那个结果是不同的。 – gartenkralle
您必须从m = 0到小于2n的log5(n)之和5^m。所以运行时间在O(n)。
例如,如果n = 125,则总和为156(< 2n)。
对于任何n,总和小于2n。
你是对的,当我在你的最后一行代码行的内循环 – Oghli
处测试n的不同情况时,我得到的模式完全相同,这很好看,括号中的因子是一个常数 – gartenkralle
你可以请我解释一下,它是如何变成O(n)使用几何级数的公式? – Tia
是的,你可以从几何级数推断时间复杂度 看到更新的答案链接。 – Oghli