//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)
。
你能解释吗?
答案 0 :(得分:5)
如有疑问,只需将n
的值替换为一些值,然后空运行两个循环。
让我们以n = 100
为例。
// loop1
for(int i = 1; i <= n; i * = 2){}
步骤(以i,n
的形式)是
从技术上讲,它可以解决7
个步骤。
// loop2
for(int i = 1; i <= logn; i ++){}
i,n
的形式)为:
这也可以通过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))。