嵌套以提高循环时间

时间:2019-06-16 04:07:12

标签: java data-structures time-complexity big-o

对于给定的代码,Big-O表示法的时间复杂度是多少?

for(i = 1; i <= n; i *= 2)
    for(j = 0; j <= i; j++)
          some_constant_statement 

第一个循环需要登录时间,但是第二个循环又如何呢?我很困惑,请帮助我理解这一点。

2 个答案:

答案 0 :(得分:1)

外部循环为O(log n),因为它运行的次数与log成正比(n个数字)。

内部循环(仅由其自身获取)为O(n),因为它运行的次数与某个数字n成正比。对于外部循环的每次迭代都是如此,因为时间复杂度保持不变,即,它总是与n被调用时的值成比例。

整个代码段为O(n log(n))。通常用来表示“大约n乘以log(n)的数量”。

Big O表示法旨在分类而不是量化。它给出了关于所讨论功能将如何在不同大小的数据集下执行的一些想法。对于给定的O(n log(n))值,描述为具有n性能的两个功能可能会有很大不同。

答案 1 :(得分:0)

时间复杂度为O(nlog(n)),但它是渐近复杂度。如果您想要运行的实际次数,它会比上限小一些。 您可以想象的是,在N较小的情况下跟踪整个过程。

在这种情况下,假设N = 8

i = 1: j = 0  => 2 times
       j = 1
i = 2: j = 0  => 3 times
       j = 1
       j = 2
i = 4: j = 0  => 5 times
       j = 1
       j = 2
       j = 3
       j = 4
i = 8: j = [0,8] => 9 times

等等,对于更大的N ...

因此,它不是线性增长,而是以某种指数形式增长,并且在绘制较大值的图并找到上限函数时,如果您是数学上的话,您将证明它的上限为O(nlog(n))。倾向于证明这一点。