所以我在想的答案是 O(log(n)),因为for嵌套的for循环 x 是double和 y double (log(n)* log(n))=(log ^ 2(n))给出 log(n)
我想的第二种方式是,因为外部和内部for循环都会将其变量加倍,所以合并的运行时就是 O(n)
而且我不确定while
循环是否会在“最终答案”中发挥作用,因为它只是添加了 log(n)。
for(x=1; x<n; x = x*2)
{
for(y=1; y<n; y=y*2)
{
a += (array[y]-array[x]);
}
}
i = n;
while(i>0)
{
a += array[i];
i = i/2;
}
return a;
答案 0 :(得分:0)
这是一个提示。
稍微修改一下代码,以计算任何给定值N的内循环迭代次数。类似以下内容:
unsigned long test1(unsigned long n)
{
unsigned long x, y;
int iterations = 0;
for (x = 1; x < n; x = x * 2) {
for (y = 1; y < n; y = y * 2) {
iterations++;
}
}
unsigned long i = n;
while (i > 0) {
iterations++;
i = i / 2;
}
return iterations;
}
现在运行它:
1,1
2,3
4,7
8,13
16,21
32,31
64,43
128,57
256,73
512,91
1024,111
2048,133
4096,157
8192,183
16384,211
32768,241
65536,273
131072,307
262144,343
524288,381
1048576,421
2097152,463
4194304,507
8388608,553
16777216,601
33554432,651
67108864,703
现在让我们使用Excel对其进行绘制。上面生成的相同的“ x”值呈指数增长,但我们仍使用线性的x和y轴对其进行绘制。
问问自己-是像y=N
或y=lg(n)
的图形吗?
答案 1 :(得分:0)
log(n)*log(n)
(即log²(n)
)为O(log(n))
需要存在常量 c 和 n 0 这样对于任何 n> n 0 ,不等式log(n)*log(n) <= c*log(n)
为真;但是,对数不受限制地增长,因此很明显,这样的常量不可能存在。
我想您将log²(n)
与log(n²)
混为一谈;后者实际上是O(log(n))
,因为适当的常数是2(任何大的值也可以),因为log(n²)
在数学上等效于2*log(n)
。
n, ld(n), f(n), 2*ld²(n)
1, 0, 1, 0
2, 1, 3, 2
4, 2, 7, 8
8, 3, 13, 18
16, 4, 21, 32
32, 5, 31, 50
64, 6, 43, 72
128, 7, 57, 98
256, 8, 73, 128
512, 9, 91, 162
1024, 10, 111, 200
2048, 11, 133, 242
4096, 12, 157, 288
8192, 13, 183, 338
16384, 14, 211, 392
32768, 15, 241, 450
65536, 16, 273, 512
131072, 17, 307, 578
262144, 18, 343, 648
524288, 19, 381, 722
1048576, 20, 421, 800
2097152, 21, 463, 882
4194304, 22, 507, 968
8388608, 23, 553, 1058
16777216, 24, 601, 1152
33554432, 25, 651, 1250
扩展表也应该很好地说明您的循环是O(log²(n))
,而不是O(log(n))
。
旁注:至少对于2的幂f(n)
是ld²(n) + ld(n) + 1
...