O(mn) 比 O((m+n)^2) 好吗?

Is O(mn) better than O((m+n)^2)?

算法的输入是 mn

我算法的时间复杂度是O(mn)

我有一个时间复杂度为 O((m+n)²) 的基准算法。

我的实现在时间复杂度方面是否优于基准?

是的,你的实现更好。回想一下 (m+n)^2 = m^2 + n^2 + 2mn,所以 (m+n)^2 > mn

O(mn) 并非在所有情况下都优于 O((m+n)²)


看这个案例:

O((m+n)²) = O(mn) 如果 m=O(n)

对于m=O(n)是可以引入一个新的变量(c:= max(n,m))

O((m+n)²) = O(m² + 2mn + n²) 
           = O(c² + 2cc + c²=
           = O( 3* c²)
           = O(c²)

O(mn)      = O(cc) = O(c²)

所以在 n 和 m 仅相差一个常数的情况下,两个复杂度是相同的。


如评论所述if not m=O(n)
O(mn) 更好当且仅当 O(n²) > O(nm)O(m²) > O(mn).


我的 Fazit: 根据你对“更好”的定义,你可以说:
O(mn)绝不会比O((m+n)²)

O(mn) 优于 O((m+n)²)

如此多的评论者和回答者希望只考虑 m = n 或至少它们之间存在常数因子的情况。这不是它的工作原理。

当我们保持 mn 不变时,您的算法显然更快;例如,如果我们将自己限制在 m = 1 这种情况下,那么你的算法的复杂度是 O(n) 而备选方案是 O(n^2),所以你的算法在这种受限情况下显然更好。

我们可以说的是,(m+n)^2 = m^2 + n^2 + 2mn 显然是 Ω(mn),其中 Ω 表示这是下限,并且您的算法(渐近地)总是至少同样好;即没有其他算法渐进地优于您的算法的限制情况。但我们确实知道在有限的情况下你的更好。所以,总的来说,你的更好。