【问题标题】:Big O notation for multiple functions多个函数的大 O 表示法
【发布时间】:2011-02-08 14:38:19
【问题描述】:

当一个人使用多个函数时,我有一个关于大 O 表示法的问题。 假设我想找出以下伪代码的时间复杂度:

heap sort array of size n
for i = 1 to n{
  retrieve array[i]
  change value of array[i]
}

我知道使用堆排序是 O(n log(n))。由于检索和更改数组中的数据是 O(1),因此循环的复杂度为 O(n)。 现在我的问题是:整个代码的复杂性是多少?仅仅是最大的时间复杂度吗? O(n log(n)) 在这种情况下? 如果是这样,看起来像这样的函数的复杂性是多少:

for i = 1 to n{
  // nothing fancy here
}
for y = 1 to n{
  // nothing fancy here either
}

提前致谢。

【问题讨论】:

  • 第一个例子是家庭作业。但事实是我自己“弄清楚”了其余的时间复杂度。然而,第二个例子不是家庭作业。我只想知道理论,所以你也只能回答第二个例子——这不是我的作业。
  • “由于检索和更改数组中的数据是 O(1)”:在评估比较排序的复杂性时,传统上计算(并提供大 O 渐近)的数量比较 需要对大小为 n 的数组进行排序,而不是算法花费的时间(想想你的数组在磁带上的情况,你必须倒带才能访问元素)。从技术上讲,您是对的,但是您对问题的表述表明您没有完全掌握复杂性理论的含义。没有“整体上的复杂性”:您必须指定准确计数的内容。

标签: algorithm complexity-theory time-complexity


【解决方案1】:
for i = 1 to n{
  // nothing fancy here
}  //O(n)

for y = 1 to n{
  // nothing fancy here
}  //O(n)

所以加起来就是O(n) + O(n) = O(n)

【讨论】:

  • 如果您提出以下 O(n^2) + O(n^2) = ,得到的大 O 会是什么?同样,这有时也让我感到困惑。我们总是简单地采取最重要的操作吗?
  • 你可以认为是O(n^2)+O(n^2)=2*O(n^2)=O(2n^2)=O(n^2)
【解决方案2】:

Big-O 表示法是关于当n(输入大小)接近无穷大时哪个因素占主导地位。因此,如果您有两块代码 AB 顺序执行,那么整体时间行为将是 O(A) 和 O(B) 中较大的一个。

在您的情况下,如果堆排序是 O(nlogn) 算法,并且循环只是 O(n) 算法,那么当 n 接近无穷大时,nlogn 最终会更大,所以它是唯一的重要的术语。 所以你的整体时间行为是O(nlogn)

当然,这都是理论。在现实世界中,如果您要在该循环中做一些缓慢的事情(例如 I/O),那么您的 n 可能必须在合并排序比循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 2019-03-22
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 2016-07-18
    相关资源
    最近更新 更多