计算算法的时间复杂度
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)
。以上是关于计算算法的时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章