【问题标题】:When is an algorithm O(n + m) time?算法 O(n + m) 时间是什么时候?
【发布时间】:2017-08-08 00:56:04
【问题描述】:

我正在解决黑客等级的this problem。我解决问题的算法是:

  1. 获取所有玩家得分的数组。遍历所有玩家得分并创建一个新数组。让一共有n个玩家。
    其中不包含任何重复的玩家分数。让我们称新 数组,playerScores。
  2. 设 Alice 要玩的总关卡为 m。
  3. 让爱丽丝第一轮后的得分为S。
  4. 让 Alice 的初始等级 R 为 0。
  5. 从后端开始迭代 playerScores 数组,直到得到分数小于 S 的玩家分数。
  6. 将 R 设置为在步骤 5 中找到的玩家的排名。
  7. 将 m 减 1。
  8. 打印 R.
  9. 现在开始在循环内处理 Alice 在所有后续 m-1 级别中的分数
    1. 将 S 设置为 Alice 的下一级分数。
    2. 从排名为 R-1 的玩家开始向前端迭代 playerScores 数组。
    3. 继续迭代,直到得到一个分数小于 S 的玩家。
    4. 将 R 设置为在上述步骤中找到的玩家的排名。
    5. 将 m 减 1。
    6. 打印 R.
    7. 如果还有更多关卡要玩(即 m>0),请转到步骤 9.1。

现在当我开始计算上述算法的大 O 时间复杂度时,我意识到它应该是 O(n),如下所示:

  1. 需要一次扫描才能获得不重复的分数。这有助于因子 n。可能所有分数都是唯一的。
  2. 需要再次从尾到前扫描以确定 Alice 在每个级别之后的排名。这再次有助于因子 n。在最坏的情况下,关卡数 (m) 可能等于玩家数 (n)。

将以上两个因素相加,时间复杂度为 O(n + n) = O(2n) = O(n)。虽然我的朋友声称它是 O(n + m),但他无法解释清楚。如果我的 O(n+n) 复杂度公式有缺陷,谁能帮我理解?

【问题讨论】:

  • 什么是“n”?什么是“米”?
  • 9.2 是9 内部的一个嵌套循环,所以它不会是其中任何一个。除此之外,一些伪代码项还不够清楚,无法确定它们的复杂性。
  • 请注意,图上的算法(带有n 顶点和m = O(n^2) 边)通常以n 和m 而不仅仅是n 来指定它们的运行时间。这抓住了算法的运行时间取决于图的密度的想法。这通常是由于需要迭代图的边缘;显然更少的边会导致更快的迭代时间。
  • @GordonLinoff n 是游戏中的玩家数量。这是作为输入。我将所有玩家的分数存储在一个长度为 n 的数组中。
  • @GordonLinoff 我更新了我的算法步骤,现在可以正确展示n 和m。

标签: algorithm time-complexity big-o asymptotic-complexity


【解决方案1】:

O(n+m) 与O(n+n) 或O(n) 不同,当您不知道m 和n 之间的关系时。有时n 可能比m 大,有时m 可能更大,但没有明确的方法可以判断。但是,如果无论如何你总是知道n>=m,那么你可以说O(n+m) 实际上就是O(n)。在这种情况下,同样的规则适用。

【讨论】:

  • 好的。知道了。在我的例子中,n 和 m 之间的关系没有定义,尽管它们的范围是。对于n,它是-1 <= n <= 2*10^5,对于m,它是-1 <= m <= 2*10^5。所以m 可以小于或等于n。凉爽的。所以我对O(n) 效率的表述是不正确的。根据您的类比,它确实是O(n+m)。感谢您的解释。
  • 我之前的评论中只有一处更正。由于m 和n 之间的关系不是确定的,所以m 可以小于、greater than 或等于n。我在之前的评论中错过了greater than 部分。
【解决方案2】:

我能够从相关人员那里获取回复。引用 Ryan Fehr:

对于这个问题,O(n+n)和O(n+m)本质上是一回事, 因为它们都有相同的上限。我决定去 O(n+m) 表示,因为它确保很明显 我的解决方案取决于 Alice beat 的级别数 在这种情况下用 m 表示。

这种区分很重要的一个例子是,当我们有一个 n 的值较小,例如 10,m 的值较大,例如 10^5。在这个 在这种情况下,对 m 的依赖对复杂性非常重要 问题。这也是将其表示为 O(n +m) 的问题,因为 如果在这种情况下 m 很小而 n 很大,那么我们将再次看到 我提供的对问题复杂性的错误陈述 符号。

不过,Big-O 表示法的好处在于它代表了 最坏的情况,所以 O(n+n) 的最坏情况与 O(n+m) 相同 因此它们是相当等价的。此时它只是一个 关于如何表示依赖的偏好问题 m 作为输入变量(如果你有这样的依赖)。

当然,如果您不依赖 m 作为输入,那么我 认为 O(n+n) => O(n) 是更好的表示 问题然后我给了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    相关资源
    最近更新 更多