【问题标题】:Calculating the amount of time an algorithm takes to run given a certain input size在给定输入大小的情况下计算算法运行所需的时间
【发布时间】:2017-04-19 13:58:10
【问题描述】:

我正在复习题为“算法和科学计算”的考试,但对如何做这道题一无所知,它来自过去的试卷。我知道一个复杂度为 O(3^n) 的算法,每添加一个新元素,复杂度就会增加三倍,而复杂度为 O(n^3) 的算法的增长与 n 的立方成正比,但我不知道如何使用该信息回答这个问题。这是问题,我将非常感谢提供的任何帮助。谢谢。

算法 A1 和 A2 的复杂度分别为 On^3 和 O3^n。在大小为 n = 10,000 的输入上,两种算法都在完全相同的时间 t = 10 秒内运行。您希望每个算法花费多少时间来处理大小的输入 一世。 n = 9,990 n = 30,000

【问题讨论】:

  • Big-O 表示法描述了复杂性的限制,因为n 接近无穷大。对于足够小的n,通常需要考虑其他因素来确定准确的运行时间。在您的情况下,您可能会忽略这些其他因素,但其他人可能不会那么幸运。

标签: algorithm time-complexity big-o


【解决方案1】:

如果我们是迂腐的,我们可以说问题未明确。

当一个算法属于 O(f(n)) 类时,意味着存在一个 k 使得它的运行时间上界为 k · f(n) .我们只给出了单个 n 值的执行时间,这并没有提供太多约束,实际上这两种算法都可以在 O(1) 中(这是 O(3n) 的子集和 O(n3) 类函数),所以一个有效的答案是这两种算法总是在 10 秒的恒定时间内运行。

这可能是问题看起来比实际更难的原因。否则,通过做出一些标准假设,如答案的下一部分所示,它变得简单明了。


在实践中,当指定算法的复杂度等级时,其目的是使提供的边界尽可能地紧。这是我们在这里应该假设的,以使这个问题得到很好的定义。

所以我们假设这两种算法的运行时间是这样的:

时间1(n) ~= k1 · n3

时间2(n) ~= k2 · 3n

使用提供的信息,我们可以找到 k1 和 k2

10 = 时间1(10000) = k1 · 100003 => k1 = 10 / 1012 = 10-11

10 = 时间2(10000) = k2 · 310000 => k2 = 10 / 310000

使用 k1 和 k2 的这些值,我们可以计算任何其他 n 值的时间,方法是将它们代入公式中的时间1(n) 和时间2(n)。

【讨论】:

  • 小心复杂性:很容易放下丑陋的反例 t = 1e-100 * n**3 + 10。该算法在n = 10000 时具有O(n**3) 复杂性和时间t = 10。但是,t = 10(相同)对于 n = 9990 以及 n = 30000...
  • 确实如此,但这正是我回答的第一部分的重点——没有一些假设,实际上有无限多的解决方案。
【解决方案2】:

这对我来说是不现实的,对于 n=10000,两种算法都需要 10 秒。话说回来。以下是我将如何尝试计算它。

K*(n1)^3 = 10 秒 K*(n2)^3 = x 其中 K 是与数据大小无关的机器相关常数。 x = (n2/n1)^3*10sec = 9.99sec

对 O(3^N) 应用相同的原则 它给出 10/3^10 秒。这是非常小的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 2018-07-02
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    相关资源
    最近更新 更多