【问题标题】:What is the overall O(n) time complexity of O(sum(a)) if a is an array of integers and n is the length of the array?如果 a 是整数数组并且 n 是数组的长度,那么 O(sum(a)) 的总体 O(n) 时间复杂度是多少?
【发布时间】:2018-05-26 09:55:34
【问题描述】:

我很难使用 O(n) 原则来概括算法的时间复杂度,其更具体的时间复杂度为 O(sum(a)),其中 a 是整数数组。

我的直觉是,这个时间复杂度应该推广到 O(n),因为您可以将其视为出现 n 次的 ki 值的“线性”方程,其中 k 是数组中的整数值,使其 O( n)( 对于直接 O(n) 的情况,k=1)。

但它似乎与 O(n) 并不完全相同 - k 的值可能比 n 大得多,如果所有这些 k 值都更大,那么你就有可能是 O(n^2 ) 或 O(n^3) 取决于该值的大小。

这是否需要考虑 O(n) 复杂度,其中 n 是数组的长度?我真的应该将 n 定义为数组中所有元素的总和,而不是数组的长度吗?

一般来说,思考这个问题的最佳方式是什么?

【问题讨论】:

  • 你读过大哦符号的定义吗?
  • 是的,当然。但我显然误解、误解或遗漏了一些东西——因此我在这里问。
  • K 的值对计算复杂度没有影响(当然如果它不依赖于“n”的值)
  • 但是,您需要在实际问题中考虑 K - 对于较小的“n”值,O(n) 算法的运行速度可能比 O(n^2) 慢.这是由于 O(n) 算法的 K 值较大
  • 我明白了,谢谢有道理。谢谢!

标签: algorithm time-complexity big-o


【解决方案1】:

从根本上说,我们希望根据输入来描述算法的运行时间。 “运行时”是一个模糊的术语,经常被掩盖。例如,排序算法或哈希表操作的“运行时间”以比较次数来衡量,但使用“运行时间”来表示基本操作的数量(通常也只是模糊定义)也是可能的。

在计算运行时间时,通常会做出两种选择(或简化)。第一个是忽略实际输入,而是使用输入的大小(以某种方式测量)。这个大小通常表示为n。第二,是使用大 O 表示法来描述最坏情况(或最好情况,或平均,或摊销......)。

这些选择都不是总是必要的,有时它们也没有意义。重复一遍,因为这是答案的症结所在:在 n 的 big-O 中描述运行时并不是描述运行时的唯一方法,有时这样做毫无意义。

例如,以O(sum(a))时间运行的算法为例:

func f(a) {
   t = 0
   for x in a {
      for i = 1..x {
         t += 1
      }
   }
}

使用输入数组a 的长度来描述它的运行时是没有用的。它没有用,因为a 的长度并没有说明最坏情况下的运行时间。

t 增加了sum(a)关于程序运行时的有用陈述。它不使用大 O 复杂度表示法。

如果你确实想用大 O 表示法来表达,你可以说这段代码的运行时间是O(sum(a))。这会模糊您在运行时测量的确切内容,因为除了递增 t 之外,您还可以包括执行语句的成本。

回到这个例子,你可以(如果你正在研究复杂性类,你可能)说n是大小(以位为单位)的输入数组。然后你可以说一下运行时间(在基本操作中测量):它是 O(2^n),因为最坏的情况输入是一个数组,其中一个元素的值为 2^n-1 (*note)。

*注意:这忽略了一些关于如何使用位对数组进行编码的技术细节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    相关资源
    最近更新 更多