计算算法的时间复杂度

Posted

技术标签:

【中文标题】计算算法的时间复杂度【英文标题】:calculating time complexity of a algorithm [duplicate] 【发布时间】:2011-06-21 08:05:04 【问题描述】:

可能重复:Plain English explanation of Big O

我已经做了 4 年的编程,但我从来没有关注过时间复杂度是多少。我明天有一个面试,我知道他们会问我关于它的问题。任何人都可以通过示例简单地帮助我理解时间复杂度吗?通过查看代码,我们如何确定它的复杂度是 O(n) 还是 O( log n) O(n) 等?

【问题讨论】:

【参考方案1】:

这是一个一般性建议:

如果有一次迭代,并且迭代变量线性递增,那么它是 O(n) 例如

for(i=0;i<n;i++) //O(n)
for(i=0;i<n;i = i + 4) // still O(n)

如果迭代变量几何递增,则为 O(log n)

例如

for(i=1;i<n;i = i * 2) //O(log n)

请注意,实现不必使用循环,它们可以使用递归来实现。

如果存在嵌套循环,其中一个复杂度为O(n),另一个复杂度为O(logn),则整体复杂度为O(nlogn);

例如

for(i=0;i<n;i++) // O(n)
 for(j=1;j<n;j=j*3) // O(log n)
//Overall O(nlogn)

这只是一个手指交叉指南。一般来说,你必须有好的概念来推导复杂性。这就是他们被要求测试您的分析能力和概念的原因。

【讨论】:

很好的例子,我有一个疑问:在第二个例子中 i=i*2 ,但在第三个例子中 j= j*3,那么为什么两者都有 O(logn) 的复杂性 这就是美丽,他们都有登录。虽然我们说logn,以2为底,但任何底都可以近似为logn。【参考方案2】:

您在这里进入了一个复杂的话题 ;-) 在大学里,您花了很多时间研究 O 表示法背后的理论。我总是倾向于归结为以下简化:

不包含任何循环的算法(例如:将文本写入控制台、从用户获取输入、将结果写入控制台)是 O(1),无论多少步。执行算法所需的“时间”是恒定的(这就是 O(1) 的含义),因为它不依赖于任何数据。

逐个遍历项目列表的算法具有 O(n) 复杂度(n 是列表中项目的数量)。如果它在连续循环中遍历列表两次,它仍然是 O(n),因为执行算法的时间仍然只取决于项目的数量。

一种具有两个嵌套循环的算法,其中内循环以某种方式依赖于外循环,属于 O(n^x) 类(取决于嵌套循环的数量)。

对已排序字段的二分查找算法属于 O(log(n)) 类,因为每一步都会减少一半的项目数。

以上内容可能不是很精确,但这是我尝试记住一些重要值的方式。仅从代码来看,确定复杂性并不总是那么容易。

对于更详细(和更正确)的阅读,David Heffernan 在他的评论中链接的问题似乎非常合适。

【讨论】:

如果你这么想的话,很容易掉入陷阱。比如print sqrt(pi)的复杂度是多少?人们常常认为库函数是O(1)

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

如何计算一个算法的时间复杂度

数据结构与算法-怎样计算时间复杂度

用啥软件来计算算法的复杂度??

请问递归算法的时间复杂度如何计算呢?

如何计算时间复杂度

一文讲透算法中的时间复杂度和空间复杂度计算方式