O(mn) 比 O((m+n)^2) 好吗?
Is O(mn) better than O((m+n)^2)?
算法的输入是 m
和 n
。
我算法的时间复杂度是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
或至少它们之间存在常数因子的情况。这不是它的工作原理。
当我们保持 m
或 n
不变时,您的算法显然更快;例如,如果我们将自己限制在 m = 1
这种情况下,那么你的算法的复杂度是 O(n)
而备选方案是 O(n^2)
,所以你的算法在这种受限情况下显然更好。
我们可以说的是,(m+n)^2 = m^2 + n^2 + 2mn
显然是 Ω(mn)
,其中 Ω
表示这是下限,并且您的算法(渐近地)总是至少同样好;即没有其他算法渐进地优于您的算法的限制情况。但我们确实知道在有限的情况下你的更好。所以,总的来说,你的更好。
算法的输入是 m
和 n
。
我算法的时间复杂度是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
或至少它们之间存在常数因子的情况。这不是它的工作原理。
当我们保持 m
或 n
不变时,您的算法显然更快;例如,如果我们将自己限制在 m = 1
这种情况下,那么你的算法的复杂度是 O(n)
而备选方案是 O(n^2)
,所以你的算法在这种受限情况下显然更好。
我们可以说的是,(m+n)^2 = m^2 + n^2 + 2mn
显然是 Ω(mn)
,其中 Ω
表示这是下限,并且您的算法(渐近地)总是至少同样好;即没有其他算法渐进地优于您的算法的限制情况。但我们确实知道在有限的情况下你的更好。所以,总的来说,你的更好。