如果我采取这个功能:
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表示法表达这个函数的复杂性的正确方法是什么?
答案 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)
嗯,基本上就像你自己说的那样:
如果您的某个参数a
或b
将是常量,则时间复杂度将为O(b)
或{{1} },因为它不依赖于常数因子。
但是,如果O(a)
和a
都可以任意大,那么asypmtotic时间复杂度(b
和a -> inf
)将为O(a * b)。< / p>
关键点在于Big O表示法描述了渐近的复杂性,因此虽然对于小b -> inf
和a
的运行时间进行直观思考可能会有点混乱其中一个是常数,当你让另一个值向无穷大增长时,线性运行时间再次有意义。