【问题标题】:Determining time complexity of for loop?确定for循环的时间复杂度?
【发布时间】:2015-03-15 21:30:12
【问题描述】:

我有循环

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

我必须以大 theta 表示法计算时间复杂度,但第一个循环中的 i/3 让我感到困惑。

【问题讨论】:

  • 外循环为 O(log n)。够用吗?
  • 我想说内部是 n^3 ,这将使它成为 O(nlog(n))?
  • 我认为cs.stackexchange.com 会更好地为您服务
  • 感谢您的链接,这让我对 in 有了很好的了解。

标签: discrete-mathematics


【解决方案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)),因为 i 每次迭代都会被削减三分之一并且将迅速达到0。

独立的内部循环很容易被视为 O(n^3)。

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

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

【讨论】:

  • 我承认我没有想到i not 是整数类型的想法。但是您对整体的复杂性是错误的;它是 O(n^3 log(n))。
  • @Beta 我只是把它扔掉,因为与 n^3 相比,它实际上是恒定的。您可能是对的,这在技术上并不正确,但我认为它不会显着改变增长曲线。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 2015-02-16
  • 2013-09-13
  • 1970-01-01
相关资源
最近更新 更多