【问题标题】:Simple Algorithm time complexity Question简单算法时间复杂度问题
【发布时间】:2010-12-10 07:25:07
【问题描述】:

我正在为数据挖掘入门课程做作业。我想弄清楚算法的时间复杂度(见下文)?它是线性/指数/对数/二次/多项式吗?任何有关如何处理此类问题的提示将不胜感激

考虑下面的算法来寻找第三小的元素 一个数组:

  • 输入:n, a[1..n] - 数字数组 a,n 是它的大小,n>=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]

【问题讨论】:

  • 只有一个循环,没有嵌套,也没有其他函数调用或任何奇怪的东西。你怎么看?
  • 你自己走了多远?
  • 这个数据挖掘课程没有对算法先决条件的某种介绍吗?

标签: algorithm big-o


【解决方案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次。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2013-10-05
          • 1970-01-01
          • 1970-01-01
          • 2016-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-09
          • 1970-01-01
          相关资源
          最近更新 更多