C++ 下面代码的算法复杂度是多少
以下代码的大O是O(n)还是O(logn)C++ 下面代码的算法复杂度是多少,c++,c,algorithm,big-o,C++,C,Algorithm,Big O,以下代码的大O是O(n)还是O(logn) for(int i=1;i
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,则代码的运行方式如下:
它循环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