【问题标题】:Running time of algorithms in seconds算法运行时间(秒)
【发布时间】:2015-10-19 16:59:41
【问题描述】:

我知道算法的运行时间用 Big O 或 Big omega 符号等表示,但我仍然无法弄清楚代码执行的时间以秒(或毫秒)为单位。例如,n=10^6,我们做 O(n),那我怎么知道需要多长时间?我也明白,例如 for 循环中的其他语句也会影响运行时间,并且不同 CPU 上的时间可能不同。但通常在编码比赛中,我们有一个特定的时间,比如 2-5 秒,在这里我无法确定我的算法是否足够高效,或者是什么让我的代码变慢。谢谢!

【问题讨论】:

  • 你不知道需要多长时间。您只知道将发生的数字操作的数量级。

标签: performance seconds


【解决方案1】:

这不是大 O 表示法的工作原理。它指的是添加“事物”时算法效率的缩放。

这不是一个绝对的时间,而是相对的。具有 O(n) 的 100 个项目将花费 10 个项目的 10 倍。 O(N^2) 意味着您期望 100 倍的差异。 (10 ^ 2 = 100, 100 ^ 2 = 10,000)

仅此而已。这是一种表达效率的方式,而不是计算运行时间。您仍然需要知道一个“操作”需要多长时间,这取决于处理器/架构。

另请参阅: What is a plain English explanation of "Big O" notation?

“Big-O 表示法是算法复杂度的相对表示。”

【讨论】:

    【解决方案2】:

    O(n) 并不是真正用于测试时间。它更多的是对可扩展性的测试。有些东西可能需要一万亿次操作,但它仍然是 O(1),因为无论输入的大小如何,它都需要 1 万亿次操作。

    跨规模测试时间的唯一方法是实际运行它,看看不同大小的输入会发生什么。

    【讨论】:

      【解决方案3】:

      O-notation 的优势在于它与机器无关,它实际上是了解算法与其他算法相比是否有效的最佳指标。请注意,计算机每年都在变得更快,因此您现在获得的以秒为单位的具体速度测量值会随着时间而变化,但是使用 O 表示法,总是很清楚用 O(log n) 解决问题比用 O(log n) 解决问题要快得多O(n)。

      但是您仍然有许多工具可以测量程序的(近似)速度执行时间。例如,在 Linux 中,您有 time 命令。然而,结果也将取决于许多其他变量(包括物理变量;例如,您的 CPU 温度可能会降低程序的性能)。由于环境的噪音,不可能测量给定算法的准确时间测量(而且它仍然没有用,因为它总是依赖于它所在的机器运行)。

      【讨论】:

      • @Andrew 谢谢!但是,为什么在比赛中我们被要求遵守时间限制?
      • @Sreenidhi 我不确定它在比赛中是如何工作的,但我猜他们在同一台机器上和相同条件下运行每个人的算法,所以他们可能已经检查过了即使是“最差可接受的算法”也在该机器上的限制时间内运行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-22
      • 2011-09-15
      • 2015-06-18
      相关资源
      最近更新 更多