简单算法时间复杂度问题

时间:2009-10-26 22:38:50

标签: algorithm big-o

我正在为一个介绍数据挖掘课程的工作。我想弄清楚算法的时间复杂度(见下文)?是线性/指数/对数/二次/多项式?关于如何处理这样的问题的任何提示都将非常感激

考虑以下算法来查找第三个最小元素 一个数组:

  • 输入:n, a[1..n] - 数组a,n是其大小,n> = 3
  • 输出: - 返回第3个最小数字
  • 临时变量:b[1..3], t, i

代码:

b[1] = a[1]
b[2] = a[2]
if b[1] > b[2] then t=b[1]; b[1]=b[2];  b[2]=t
b[3] = a[3]
if b[2] > b[3] then t=b[2]; b[2]=b[3]; b[3]=t
if b[1] > b[2] then t=b[1]; b[1]=b[2]; b[2]=t
for (i = 4; i <= n; i = i+1)
  if a[i] < b[3] then b[3] = a[i]
  if b[2] > b[3] then t=b[2]; b[2]=b[3]; b[3]=t
  if b[1] > b[2] then t=b[1]; b[1]=b[2]; b[2]=t
return b[3]

4 个答案:

答案 0 :(得分:5)

一个好的经验法则是:你在输入上循环多少次?

答案 1 :(得分:2)

它是线性的,因为唯一的内部循环最多重复n次,并且只执行恒定的时间操作。

更具体地说

1. b[1] = a[1]
2. b[2] = a[2]
3. if b[1] > b[2] then t=b[1]; b[1]=b[2]; b[2]=t
4. b[3] = a[3]
5. if b[2] > b[3] then t=b[2]; b[2]=b[3]; b[3]=t
6. if b[1] > b[2] then t=b[1]; b[1]=b[2]; b[2]=t
7. for (i = 4; i <= n; i = i+1)
8. | if a[i] < b[3] then
9. | | b[3] = a[i]
10. | | if b[2] > b[3] then t=b[2]; b[2]=b[3]; b[3]=t
11. | | if b[1] > b[2] then t=b[1]; b[1]=b[2]; b[2]=t
12. return b[3]

第1-6行只执行一次,应该是恒定时间。在单次运行for循环的上下文中,第8-11行只执行一次,并且都是常量时间操作;然后重复~n-3次。

答案 2 :(得分:0)

这是O(n),看看输入是什么总是好的,看看在这种情况下你是否要向数组添加另一个元素会有什么变化。

你会发现你必须扫描数组才能找到数组中第3个最小的元素。

答案 3 :(得分:0)

时间复杂度是线性的,为O(n)。从4到n,仅执行一次迭代。因此时间复杂度为O(n)