每个案例(a-d)的增长函数是什么?
我很难找到每个嵌套for循环的运行时间。我想我找到了其中一些,但我不确定。
A)
for(i = 1; i*i <= N; i = 2*i);
b)中
for(i = 1; i <= N; i = 2*i);
for(j = 1; j <= i; j = j+1);
c)中
for(i = 1; i*i <= N; i=i+1);
for(j=1; j <= i ; j=j+1);
d)
for(i = 1; i*i <= N; i=i+1)
for(j = 1; j <= i ; j = 2*j);
答案 0 :(得分:4)
这就是我得到的:
<强>生长强>
O(log(sqrt(N)))
O(N)
O(N)
O(log(sqrt(N)!)) = O(sqrt(N)*log(sqrt(N)))
使用Stirling's approximation 确切数字([X]
是X的整数部分)
[log([sqrt(N)])]+1
2^([log(N)]+1)
[sqrt(N)]*[sqrt(N)+1]/2
这里有一点检查:我用计数器实现了for循环,这是N=10000000
的输出:
a(N)= 12 a(10*N)= 14
b(N)= 16777216 b(10*N)= 134217728
c(N)= 5000703 c(10*N)= 50005000
d(N)= 33861 d(10*N)= 123631
编辑:根据要求,解释
首先,考虑一下:
sqrt
和log
)你应该实际取整数部分。log = log base 2
现在:
i
从1变为sqrt(N)
,但它仅使用“2”的幂。在1之间有log(M)
(实际上+1)2的幂和M,所以用M = sqrt(N)
得到公式。
i
从1
到N
的权力为2,与之前一样。对于每个i
,都有i
个js。如果我们将每个i
的js相加:
1 + 2 + 4 + 8 + 16 + ... + 2^log(N) = 2N - 1 = O(N)
i
从1
转到sqrt(N)
。对于每个i
,都有i
个js。和以前一样,我们总结每个i
的js数量:
1 + 2 + 3 + 4 + 5 + ... + sqrt(N) = sqrt(N) * sqrt(N+1) / 2 = O(N)
i
从1
转到sqrt(N)
。对于每i
j
,1
仅使用2的幂,从i
到i
,因此对于每个log(i)
,您有log(1) + log(2) + log(3) + log(4) + log(5) + ... + log(sqrt(N))
个js。如果你把每一个j的总和加起来:
log(a) + log(b) = log(a*b)
对于对数log(1*2*3*4*5*..*sqrt(N)) = log( sqrt(N)! )
的属性。将此应用于我们的总和:
ln(N!) -> N*log(N) - N
这是结果。鉴于阶乘是大数的问题,你可以使用斯特林的近似值:log(N)
来表示大数。
使用整数部分的差异示例
考虑2. N
的整数部分保持不变,直到for
加倍。这意味着,例如,此131072
周期为N=65536
和N = 131071
执行相同数量的操作(N
)。当131072
变为262144
(仅一个)时,操作次数加倍({{1}})。
答案 1 :(得分:1)
您可以使用Sigma Notation正式解决代码片段:
<强> A)强>
<强> b)中强>
<强> c)中强>
<强> d)强>