以下代码片段的算法复杂度

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 不是常数

【讨论】:

以上是关于以下代码片段的算法复杂度的主要内容,如果未能解决你的问题,请参考以下文章

17 算法复杂度

前端 算法的时间复杂度和空间复杂度

以下代码片段的时间复杂度是多少?

排序算法归并排序

为啥以下算法(循环排序?!)的时间复杂度是 O(n)?

以下递归算法的时间复杂度是多少?