以下代码片段的算法复杂度
Posted
技术标签:
【中文标题】以下代码片段的算法复杂度【英文标题】:algorithmic complexity of following code snippet 【发布时间】:2013-11-19 09:39:31 【问题描述】:我们都知道对于像 sn-p 这样的代码
for(int i=0;i<n;i++) //do something
复杂度为 O(n),我们可以找到它:
求和符号从 n=0 到 n-1 c1 = c1* ((n-1)*n)/2
如果代码将是:
for(int i=0;i<n;i+=2) //do something
我不仅对大 o 符号感兴趣,而且对精确的增长率函数感兴趣。
有人帮我吗?提前致谢
【问题讨论】:
复杂度与之前的循环相同。 O(n) 不是 O(n^2) 据我所见,你的第一个语句是 O(n),除非循环中发生其他 O(n)... 两个循环的复杂性对我来说是相同的,它将是 O(n) 而不是 O(n^2) 我已经更正了,错误见谅 【参考方案1】://do something
应执行 n/2 次。
Hence complexity = O(n/2) = O(n) (same as the previous loop)
实际上显然第二个循环将花费更少的时间,因为它只执行一半的语句。然而,随着 n 的增长,两个循环的时间复杂度增长应该是线性。
【讨论】:
【参考方案2】:for(int i=0;i<n;i++) /* do something */
它具有未知的复杂性,我们不知道/* do something */
。如果循环体没有基于n
的内部循环。它的复杂度O(n)。
for(int i=0;i<n;i+=2) /* do something */
和上面一样,这也有复杂度O(n)。注意 O(n/2) = O(n).
【讨论】:
【参考方案3】:当您采用大 O 表示法时,我们假设 n 是一个正集。
N 可以通过 2 种方式增长 1-线性 2-指数地
如果我们将 n 乘以 >1 的整数,N 会呈指数增长。考虑代码 sn -p
for(i=1;i<n;i=i*2)
这里n增加了一个很大的值,即2,4,8,16,32....
如果我们将n增加一个整数,N会线性增长>0(你给出的代码线性增长)
对于线性增长,时间复杂度为 O(n)
对于指数增长,时间复杂度为 O(logn)
让我们考虑另一个例子
for(i=0;i<n*10;i++)//has Complexity O(n)
for(i=0;i<n*n;i++)//has Complexity O(n*n)
这是因为 10 是常数,而 n 不是常数
【讨论】:
以上是关于以下代码片段的算法复杂度的主要内容,如果未能解决你的问题,请参考以下文章