计算算法的时间复杂度

时间:2011-02-04 12:17:05

标签: algorithm complexity-theory

  

可能重复:
  Plain English explanation of Big O

我现在已经做了4年的编程,但我从未关注时间复杂性。我明天接受采访,我知道他们会问我关于它的问题。任何人都可以用简单的例子帮助我理解时间复杂性吗?通过查看代码,我们如何判断它的复杂性是O(n)还是O( log n)O(n)等?

2 个答案:

答案 0 :(得分:19)

以下是一般性建议:

如果存在单次迭代,并且迭代变量线性递增则则为O(n) e.g。

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

如果迭代变量在几何上递增,那么它是O(log n)

e.g

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

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

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

e.g

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

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

答案 1 :(得分:10)

你在这里进入一个复杂的话题;-)在大学里,你花了很多时间在O符号背后的理论上。我总是倾向于采用以下简化:

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

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

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

排序字段上的二进制搜索算法位于O(log(n))类中,因为每个步骤中项目数减少了一半。

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

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