【问题标题】:how is the running time for constant-sized input constant?常量输入常量的运行时间如何?
【发布时间】:2017-05-17 07:21:53
【问题描述】:

我在 Cormen 看到了这样的声明:

由于算法在恒定大小输入上的运行时间是一个常数,因此算法运行时间产生的递归通常具有 对于足够小的 n,T(n)=theta(1)。

但是如果我们考虑排序,那么即使输入大小是恒定的,运行时间也会发生变化(当输入已经排序时,与输入按降序排列的情况相比,我们必须将其按升序排序)。运行时间怎么能恒定?

【问题讨论】:

  • 如果 n 非常小,比如 n = 10 或 n = 2,那么算法的运行速度就会非常快。如果算法中的另一个变量比 n 大得多,则可以假设时间是常数
  • 对于恒定大小的输入,最佳、最差和平均情况的上限和下限是恒定的。 “运行时间 [复杂性] ... 是恒定的”不应被理解为“对于该大小的任何输入,它总是需要完全相同数量的操作”。

标签: algorithm sorting asymptotic-complexity


【解决方案1】:

假设我们比较了 3 种算法

  • A 运行时间正好:122n+1 (= O(n))
  • B,运行时间恰好为:5*n²+4*n +17 (= O(n²))
  • C 运行时间恰好为:n³ +20 (= O(n³))

如果我们 git 每个相同大小的恒定大小 n=4 的输入,我们会得到不同的运行时间

  • 答:144 个时间单位
  • B:113 个时间单位
  • C:84 个时间单位

即使所有三种算法具有不同的复杂度,特定(恒定)n 值的结果也会产生恒定的运行时间。

因此,从结果 144 113 84 中,您无法说明其他 n 值的不同算法的复杂性。

因此,仅当您想针对 n 的所有可能变量描述算法的行为时,O-Notation 才有意义。如果您只对特定 n 的运行时间感兴趣,那么 O-notation 是没有用的,因为它不会告诉您任何有关因素的信息。在我上面的示例中,具有最差复杂度 (C) 的算法在给定 n=4 的情况下运行时间最短。

简而言之:无论算法的复杂性如何,如果您放入一个恒定大小的问题,您将始终获得恒定的运行时间。

o-notation 仅描述与不同输入大小相关的运行时间变化,并且还从任何常数因素中抽象出来。

wikipedia Big O-notation

【讨论】:

  • 我认为 OP 的一个例子是关于 n=1000 的线性搜索,它可以进行 1 到 1000 次比较,具体取决于我们要查找的元素的位置。这个答案似乎没有解决这个问题。
  • @Dukeling:即使对于 n=1000,无论算法是 O(n) 还是 O(n²) 或其他什么,它也只是一个恒定的比较量。
【解决方案2】:

对给定问题使用已建立的算法预先计算一个表,该表在第 1 列中包含大小为 n 的所有不同输入,在第 2 列中包含与同一行第 1 列中的输入相对应的算法输出。现在修改后的算法是使用输入作为表第 1 列的索引,并仅输出该行第 2 列中包含的内容。

表格的大小是固定的m,因为它是预先计算的。所以修改算法的运行时间只依赖于m,因为它最多需要输出一些大小为m的数据。因此修改后算法的运行时间为O(1)

【讨论】:

    猜你喜欢
    • 2018-11-03
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    相关资源
    最近更新 更多