【问题标题】:Analyzing algorithms - Why only time complexity?分析算法 - 为什么只有时间复杂度?
【发布时间】:2013-03-23 01:58:53
【问题描述】:

我正在学习算法和时间复杂度,这个问题突然出现在我的脑海中。

为什么我们只分析算法的时间复杂度?

我的问题是,不应该有另一个指标来分析算法吗?假设我有两个算法 A 和 B。

A 需要 5s 处理 100 个元素,B 需要 1000s 处理 100 个元素。但两者都有O(n) 时间。

所以这意味着 A 和 B 的时间都比cn 增长慢,因为两个单独 常量c=c1c=c2。但在我非常有限的算法经验中,我们总是忽略这个常数项,只关注增长。但是,在我给定的 A 和 B 示例之间进行选择时,这不是很重要吗?在这里c1<<c2 所以算法 A 比算法 B 好很多。

还是我在早期阶段想得太多,然后才能进行适当的分析?它叫什么?

或者我对时间复杂度的整个概念是错误的,在我给定的示例中,两者都不能有O(n) 时间?

【问题讨论】:

  • Nitpick:我们不仅分析时间上的复杂性,还分析空间上的复杂性、进行的比较、进行的交换、对相关预言机的查询或任何感兴趣的事情。但是,是的,常量通常被忽略。

标签: algorithm


【解决方案1】:

我们担心增长的顺序,因为当输入大小趋于无穷大时,它为算法的行为提供了有用的抽象。

O 表示法“隐藏”的常数很重要,但它们也难以计算,因为它们取决于以下因素:

  • 用于实现算法的特定编程语言
  • 正在使用的特定编译器
  • 底层 CPU 架构

我们可以尝试估计这些,但一般来说这是一个失败的原因,除非我们做出一些简化的假设并在一些定义明确的计算模型上工作,比如@ 987654321@型号。

但是,我们又回到了抽象的世界,正是我们开始的地方!

【讨论】:

  • +1:常量不仅被 BigOh 隐藏,甚至 Omega 和 Theta 也被隐藏,在讨论时间复杂度时也会用到。
【解决方案2】:

我们测量lots of other types of complexity

但我猜你更多的是在谈论“常量不重要吗?”方法。是的,他们有。忽略常量有用的原因是它们不断变化。不同的机器以不同的速度执行不同的操作。您必须在一般有用和在特定机器上有用之间找到界限。

【讨论】:

    【解决方案3】:

    时间并不总是如此。还有空间。

    至于 O() 给你的渐近时间成本/复杂度,如果你有很多数据,那么,例如,O(n2)=n2对于 n>100, 将比 O(n)=100*n 更差。对于较小的 n,您应该更喜欢这个 O(n2)。

    而且,显然,O(n)=100*n 总是比 O(n)=10*n 差。

    你的问题的细节应该有助于你在几个可能的解决方案(算法的选择)之间做出决定。

    【讨论】:

      【解决方案4】:

      A 需要 5s 处理 100 个元素,B 需要 1000s 处理 100 个元素。但两者 有 O(n) 时间。

      为什么会这样?
      O(N) 是一个渐近测量执行一个与程序输入相关的程序所需的步骤数。
      这意味着对于非常大的 N 值,算法的复杂性是线性增长的。
      我们不比较 XY 秒。我们分析算法在输入越来越大时的表现

      【讨论】:

        【解决方案5】:

        O(n) 让您知道对于不同的 n,相同的算法会慢多少,而不是比较算法。 另一方面,还有空间复杂度——内存使用量如何随着输入 n 的函数增长。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-07
          • 2016-06-17
          相关资源
          最近更新 更多