确定for循环的时间复杂度?

时间:2015-03-15 21:30:13

标签: discrete-mathematics

我有循环

sum = 0 ;
    for ( i = n ; i > 0; i = i/3 )
        for ( j = 0 ; j < n^3 ; j++ )
              sum++ ;

我必须弄清楚big theta表示法中的时间复杂度,但是第一个循环中的i / 3让我感到困惑。

1 个答案:

答案 0 :(得分:-1)

在正常数学中,此循环永远不会终止。 O(INF)。在离散数学中,它是O(n ^ 3)。

外圈...

for ( i = n ; i > 0; i = i/3 )

当i大于0时,循环运行。如果i为正,则将i减少三分之一永远不会使i低于0变得越来越小。

如果i是IEEE浮点数,经过大量迭代后它最终会达到0,具体取决于浮点数的大小。

如果假设数字是整数(这是我认为你用离散数学标签提出的问题),那么外部循环是O(log(n)),因为我每次迭代都会被切割三次并将迅速达到0。

内部循环,单独站立,很容易看出为O(n ^ 3)。

for ( my $j = 0; $j < $n**3 ; $j++ ) {
    $sum++;
}

O(log(n))环内的O(n ^ 3)环是O(n ^ 3log(n)),其与O(n ^ 3)的生长曲线没有显着不同。