Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 下面代码的算法复杂度是多少_C++_C_Algorithm_Big O - Fatal编程技术网

C++ 下面代码的算法复杂度是多少

C++ 下面代码的算法复杂度是多少,c++,c,algorithm,big-o,C++,C,Algorithm,Big O,以下代码的大O是O(n)还是O(logn) for(int i=1;i

以下代码的大O是O(n)还是O(logn)

for(int i=1;i
它看起来像O(n)或者我完全忽略了这一点吗?

它是
O(logn)
,因为
I
每次都加倍。因此,总体而言,您需要迭代
k
次,直到
2^k=n
,在这种情况下,当
k=logn
(因为
2^logn=n
)时就会发生这种情况

简单示例:假设
n=100
-然后:

iter1: i = 1
iter2: i = 2
iter3: i = 4
iter4: i = 8
iter5: i = 16
iter6: i = 32
iter7: i = 64
iter8: i = 128 > 100
很容易看出,当
n
增加一倍时,将添加一个迭代,这是对数行为,而线性行为是添加迭代以不断增加
n


p.S.(编辑):从数学上讲,算法确实是
O(n)
-因为big-O表示法给出了渐近上界,并且您的算法渐进地“更快”运行,然后
O(n)
-所以它确实是
O(n)
-但它不是一个紧的界(它不是
Theta(n)
)我怀疑这就是你想要的。

O(log(n)),因为你只循环~log2(n)次

不,复杂性不是线性的。试着玩几个场景:对于n=2,n=4,n=16,n=1024,这个循环要进行多少次迭代?n=1024*1024怎么样?这可能会帮助您获得正确答案。

复杂度为O(logn),因为循环运行(log2n-1)次。

对于循环检查,运行lg(n)+1次。内部循环运行lg(n)次。因此,复杂性是O(lgn),而不是O(logn)

如果n==8,则代码的运行方式如下:

  • i=1
  • i=2
  • i=4
  • i=8——退出条件
  • 它是O(log(n))。 看看代码num++;
    它循环O(logn))次。

    O(lgn)和O(logn)之间没有区别。为了解释@TedHopp的评论,我将添加:
    logk(n)=logm(n)/logm(k)
    。在这种情况下:
    log(n)=lg(n)/lg(10)
    。既然
    lg(10)
    是常数,在大O符号下,
    O(log(n))=O(lg(n))
    为什么这看起来像O(n)?感谢大家的解释,非常感谢。我对这一点还不熟悉,但现在我完全明白为什么它必须是O(logn)。
    iter1: i = 1
    iter2: i = 2
    iter3: i = 4
    iter4: i = 8
    iter5: i = 16
    iter6: i = 32
    iter7: i = 64
    iter8: i = 128 > 100