【发布时间】:2011-06-21 08:05:04
【问题描述】:
我已经做了 4 年的编程,但我从来没有关注过时间复杂度是多少。我明天有一个面试,我知道他们会问我关于它的问题。任何人都可以通过示例简单地帮助我理解时间复杂度吗?通过查看代码,我们如何确定它的复杂度是 O(n) 还是 O( log n) O(n) 等?
【问题讨论】:
标签: algorithm complexity-theory
我已经做了 4 年的编程,但我从来没有关注过时间复杂度是多少。我明天有一个面试,我知道他们会问我关于它的问题。任何人都可以通过示例简单地帮助我理解时间复杂度吗?通过查看代码,我们如何确定它的复杂度是 O(n) 还是 O( log n) O(n) 等?
【问题讨论】:
标签: algorithm complexity-theory
这是一个一般性建议:
如果有一次迭代,并且迭代变量线性递增,那么它是 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)
这只是一个手指交叉指南。一般来说,你必须有好的概念来推导复杂性。这就是他们被要求测试您的分析能力和概念的原因。
【讨论】:
您在这里进入了一个复杂的话题 ;-) 在大学里,您花了很多时间研究 O 表示法背后的理论。我总是倾向于归结为以下简化:
不包含任何循环的算法(例如:将文本写入控制台、从用户获取输入、将结果写入控制台)是 O(1),无论多少步。执行算法所需的“时间”是恒定的(这就是 O(1) 的含义),因为它不依赖于任何数据。
逐个遍历项目列表的算法具有 O(n) 复杂度(n 是列表中项目的数量)。如果它在连续循环中遍历列表两次,它仍然是 O(n),因为执行算法的时间仍然只取决于项目的数量。
一种具有两个嵌套循环的算法,其中内循环以某种方式依赖于外循环,属于 O(n^x) 类(取决于嵌套循环的数量)。
对已排序字段的二分查找算法属于 O(log(n)) 类,因为每一步都会减少一半的项目数。
以上内容可能不是很精确,但这是我尝试记住一些重要值的方式。仅从代码来看,确定复杂性并不总是那么容易。
对于更详细(和更正确)的阅读,David Heffernan 在他的评论中链接的问题似乎非常合适。
【讨论】:
print sqrt(pi)的复杂度是多少?人们常常认为库函数是O(1)。