【问题标题】:Sum of linear time algorithms is linear time?线性时间算法的总和是线性时间吗?
【发布时间】:2012-09-18 14:31:01
【问题描述】:

如果问题“愚蠢”,请原谅我。我是算法时间复杂度的新手。

我知道如果我有 n 个数字并且我想对它们求和,它需要“n 步”,这意味着算法是 O(n) 或线性时间。即,所采取的步数随着输入数 n 线性增加。

如果我编写一个新算法,依次进行 5 次求和,我知道它是 O(5n) = O(n) 时间,仍然是线性的(根据 wikipedia)。

问题

如果我说 10 种不同的 O(n) 时间算法(求和、线性时间排序等)。然后我在 n 个输入上一个接一个地运行它们。

这是否意味着总体上运行 O(10n) = O(n),线性时间?

【问题讨论】:

    标签: algorithm time-complexity


    【解决方案1】:

    是的,对于任何 常数 kO(kn) = O(n)

    如果您开始增加您的问题并确定您的 10 个线性操作实际上是 k 个线性操作,假设 k 是用户输入数组的长度,那么从 big-oh 中删除该信息是不正确的

    【讨论】:

      【解决方案2】:

      最好从 big-O 的定义中解决它,然后在“证明”它正确后学习经验法则。

      如果你有 10 个O(n) 算法,这意味着有 10 个常量 C1 到 C10,这样对于每个算法 Ai,对于足够大的 n,执行它所花费的时间小于 Ci * n。

      因此[*] 为足够大的 n 运行所有 10 种算法所需的时间小于:

      C1 * n + C2 * n + ... + C10 * n

      = (C1 + C2 + ... + C10) * n

      所以总数也是O(n),常数C1 + ... + C10

      经验法则:恒定数量的O(f(n)) 函数的总和是O(f(n))

      [*] 这一点的证明留给读者。提示:有 10 种不同的“足够”值需要考虑。

      【讨论】:

      • 很好的回复。谢谢!可惜我只能接受 1 个答案。
      【解决方案3】:

      是的,O(10n) = O(n)。此外,O(C*n) = O(n),其中 C 是常数。在这种情况下,C 为 10。如果 C 等于 n,它可能看起来像 O(n^2),但事实并非如此。因为 C 是常数,所以不 随 n 变化。

      另外,请注意,在复杂性的总和中,最高阶或最复杂的阶被认为是整体复杂性。在这种情况下,它是 O(n) + O(n) ... + O(n) 十次。因此,它是 O(n)。

      【讨论】:

      • 正如 Steve Jessop 指出的,这 10 个单独的常数可能不同。此外,说最高阶项被“考虑”为整体复杂性可能有点误导,因为这表明这只是一个约定,而实际上它在数学上被 big-Oh 的定义所暗示。
      • 例如假设一个算法需要时间 Dn^2 + En + F,其中 D 为正,E 和 F 不受限制。然后设置 C = D + E' + F',其中如果 E >= 0,则 E' 为 E,否则为 0,对于 F' 也是如此。那么 Cn^2 = Dn^2 + E'n^2 + F'*n^2,对于任何 n >= 1,这是 >= Dn^2 + E*n + F 因为单独考虑的每一项都是>=,所以算法是O(n^2),常数C。
      • 是的,正确的。它在数学上是隐含的,而不仅仅是“考虑”。是我选择的词出错了,但我的意思是一样的。感谢您指出。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      • 2016-02-05
      • 2012-08-09
      • 1970-01-01
      • 2011-05-02
      • 2018-08-29
      相关资源
      最近更新 更多