大O与2个变量相乘

时间:2016-11-12 12:09:40

标签: python algorithm big-o computer-science

如果我采取这个功能:

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

这里相当清楚,在数量方面的复杂性将是* b。

到目前为止很好。

所以,如果我想根据一个方法计算出大O,我想我必须考虑函数有O(n),因为在这种情况下我必须将b视为常数值?

同样,如果我想用b表示大O,那么出于同样的原因它将是O(n)。

这似乎有意义但直观地使用这样的嵌套迭代块我期望O(n ^ 2)或其他一些指数类型值。当你考虑a和b具有相同的值时,这是完全合理的(即让a = 5,让b = 5,将有25个赋值)。

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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

Big O是衡量输入大小的函数。如果你测量它,例如n = |a| + |b|n = max(|a|,|b|)然后复杂性为O(n^2),这是用单个参数表达它的最合理方式。另一方面,您可以将其保留为O(a*b)。除非您打算修复其中一个或另一个值,否则说它是O(a)O(b)会产生误导。

答案 2 :(得分:0)

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

如果您的某个参数ab将是常量,则时间复杂度将为O(b)或{{1} },因为它不依赖于常数因子。

但是,如果O(a)a都可以任意大,那么asypmtotic时间复杂度(ba -> inf)将为O(a * b)。< / p>

关键点在于Big O表示法描述了渐近的复杂性,因此虽然对于小b -> infa的运行时间进行直观思考可能会有点混乱其中一个是常数,当你让另一个值向无穷大增长时,线性运行时间再次有意义。