【问题标题】:Big O with 2 variables which multiply together具有 2 个变量的大 O 相乘
【发布时间】:2017-03-26 13:15:06
【问题描述】:

如果我接受这个功能:

def nested_multiplier(a, b):
    """
    returns a*b
    """
    count = 0
    for i in range(a):
        for j in range(b):
            count += 1
    return count

这里很清楚,就分配数量而言,复杂度将是 a * b。

到目前为止还不错。

因此,如果我想用 a 来计算大 O,我想我必须考虑该函数具有 O(n),因为在这种情况下我必须将 b 视为一个常数值?

同样,如果我想要 b 的大 O,出于同样的原因,它会是 O(n)。

这似乎是有道理的,但直观地说,对于像这样的嵌套迭代块,我期望 O(n^2) 或其他一些指数类型的值。当您考虑 a 和 b 具有相同的值时,这非常有意义(即让 a = 5 和让 b = 5 将有 25 个分配)。

那么用大 O 表示法来表达这个函数的复杂性的正确方法是什么?

【问题讨论】:

  • 这个问题比较适合计算机科学堆栈交换但我也回答了。

标签: python algorithm big-o computer-science


【解决方案1】:

您可以在 O(n) 表示法中使用两个变量。例如,这个graph complexity question 使用顶点数和边数进行复杂性分析。在您的情况下,答案将是 O(a*b),或者如果您希望它更像 n,您可以使用 O(n*m)。

假设 b 或 a 作为常数以仅使用 O(n) 表示法中的一个变量会误导分析。始终使用影响复杂性的每个输入。

【讨论】:

    【解决方案2】:

    Big O 是衡量输入大小的函数。如果您将其测量为例如n = |a| + |b|n = max(|a|,|b|) 那么复杂度是O(n^2),用单个参数来表达是最合理的方式。另一方面,您可以简单地将其保留为O(a*b)。说它是 O(a)O(b) 具有误导性,除非您打算修复其中一个值。

    【讨论】:

      【解决方案3】:

      嗯,基本上就像你自己说的那样:

      如果您的参数之一 ab 将是 常量,那么时间复杂度将是 O(b)O(a),因为它不依赖于关于常数因子。

      但是,如果 ab 都可以任意大,那么渐近时间复杂度(a -> infb -> inf)将为 O(a * b)。

      要点是大 O 表示法描述了 渐近 复杂性,因此尽管直观地考虑小型 ab 的运行时可能会有点令人困惑,因为它们中的一个是一个常数,当您让另一个值向无穷大增长时,线性运行时再次有意义。

      【讨论】:

        猜你喜欢
        • 2022-11-18
        • 2012-01-25
        • 1970-01-01
        • 1970-01-01
        • 2017-08-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-15
        相关资源
        最近更新 更多