给定循环O(logn)或O(n)的时间复杂度

时间:2018-11-07 13:22:04

标签: algorithm time-complexity big-o complexity-theory

//loop1
for (int i = 1; i <= n; i*=2) { }
//loop2
for (int i = 1; i <= logn; i++) { }

我们与我的朋友讨论了有关循环的问题,我认为第一个循环为O(logn),第二个循环为O(n)。但是,对于后者,他说也是O(logn)而不是O(n)

你能解释吗?

2 个答案:

答案 0 :(得分:5)

如有疑问,只需将n的值替换为一些值,然后空运行两个循环。

让我们以n = 100为例。

  

// loop1

     

for(int i = 1; i <= n; i * = 2){}

步骤(以i,n的形式)是

  • 1,100
  • 2,100
  • 4,100
  • 8,100
  • 16,100
  • 32,100
  • 64,100
  • 128,100

从技术上讲,它可以解决7个步骤。

  

// loop2

     

for(int i = 1; i <= logn; i ++){}

  • log 2 (100)= 6.64〜7。
  • 步骤(以i,n的形式)为:
    • 1,7
    • 2,7
    • 3,7
    • 4,7
    • 5,7
    • 6、7
    • 7,7
    • 8、7

这也可以通过7步骤来解决。因此,这两种方法都具有相同的复杂度,即O(log(n))。

答案 1 :(得分:3)

简短答案:

两者均为Log (n),因为对于输入 n ,两个循环都将运行 Log(n)次。

由于for循环中的i *= 2,第一个循环运行 Log(n)次,而第二个循环运行 Log(n)次,因为for循环中的上限直接设置为该值。


详细信息:

Big-O告知功能的增长率。第二个循环(这是您感到困惑的一个循环)实际上是两个循环中更简单的一个。您可以直接看到,对于任何输入 n ,该函数将始终仅花费与 Log(n)成比例的时间。

因此,第二个循环的增长率与 Log(n)成正比,换句话说,等于O(Log(n))。