O(m + n)和O(mn)之间的差异?

时间:2014-05-27 18:23:25

标签: algorithm runtime big-o time-complexity asymptotic-complexity

我试图通过不同的方法找到算法的复杂性。在数学上我遇到了一个O(m + n)和另一个O(mn)方法。但是,我无法掌握或说出这一点。这不像是我看着他们并得到“啊!这就是发生了什么”的感觉!有人可以使用他们自己的例子或任何其他工具解释这个吗?

3 个答案:

答案 0 :(得分:8)

O(m+n)示例:

for(int i = 0, i < m, i++)
    //code
for(int j = 0, j < n, j++)
    //code

m迭代代码发生。然后n迭代代码发生。

O(mn)示例:

for(int i = 0, i < m, i++)
    for(int j = 0, j < n, j++)
        //code

对于m的每次迭代,我们都有n次代码迭代。想象一下迭代非方形2D数组。

mn不一定等于相同的值。如果 等于相同的值,那么对于O(m+n)

O(m+n) => O(m+m) => O(2m) => O(m)

我建议您查看this question/answer以了解最后一次过渡。

对于O(mn)

O(mn) => O(mm) => O(m^2)

答案 1 :(得分:4)

我对寻找直觉的建议被认为是如下实验:

首先,要意识到m和n是两个输入的不同测量值。它们可能是两个输入流的长度,矩阵边长,或同一数据结构的两个不同属性的计数,例如同一图的边和节点数,或任何类似的度量。

直觉是big-O在一个简单的函数方面表达了算法 true 运行时(或者其他一些方面,如比较计数或所需空间)的界限 - 调用R(m,n) - 乘以某个任意常数。我们忽略常数因子,并通过调用它们的运行时间O(R(m,n))来考虑由同一个R作为族的所有算法。

因此,大O(m + n)表示对于适当大的m和n,实际运行时间受某些函数R(m,n)= C(m + n)的限制。对于图形示例,这表示算法的实际运行时间将受顶点数和边数之和的倍数限制。

您可以将边界函数视为具有轴m,n和R(m,n)的3d图形。或者你可以想到图表:

R(m,n) = m + n
--------------
m=  1  2  3  4
n=1 1  2  3  4
  2 3  4  5  6
  3 4  5  6  7
  4 5  6  7  8

对于R(m,n)= mn,你有

R(m,n) = mn
--------------
m=  1  2  3  4
n=1 1  2  3  4
  2 2  4  6  8
  3 3  6  9 12
  4 4  8 12 16

作为一个三维图形,第一个函数是一个平面,第二个函数几乎在所有点上都是一个快速增长的函数。这意味着如果m和n增长得足够大,O(mn)界限最终会比O(m + n)更大(对应于可能更慢的程序),因为常数变得无关紧要。

对于快速增长成本的一个例子,假设O(m + n)算法在其运行时界限中具有3的额外常数因子(与上述两种算法相比,它在小输入上可能非常慢): / p>

R(m,n) = 3(m + n)
--------------
m=   1  2  3  4
n=1  3  9 12 15
  2  9 12 15 18
  3 12 15 18 21
  4 15 18 21 24

所以O(m + n)看起来它的约束比上图中的O(mn)约束更少。但是看看m = n = 100的情况。这里O(m + n)算法的约束是3(m + n)= 600.但是具有小常数的O(mn)算法已经绑定了mn = 10000.显然,如果m和n很大,你想要第一个算法。

@Anonymous在本文的初始版本上提出了一个很好的观点,这让大O和大Theta感到困惑。 Big-O仅处理被测数量的边界或上限。例如,这意味着每个 O(n)算法也是O(n log n)和O(n ^ 2)。如果实际运行时间受到增长较慢的函数的限制,那么它也受到所有增长速度较快的函数的限制。

然而,人们常说'#34;这种算法是O(n)&#34;而意味着界限。也就是说,对于某些常数C,Cn是运行时间的上限,并且对于某些其他常数D(并且适当地大的n),Dn也是下限。这种紧密界限适当地表示为Theta(n),而不是O(n)。 Theta(R(m,n))算法的运行时间(粗略地说)与R(m,n)成比例。

我最后补充说,在很多情况下你不能忽略常量。文献中存在许多渐近渐近的算法。比常用的常量,但常量如此之大,以至于对于实际问题,它们总是太慢。计算几何有很多例子。 Radix 2排序是另一种。它是Theta(n),但实际上一个好的快速排序(Theta(n log n)平均情况)将在大小至少为10 ^ 8整数的数组上击败它。

答案 2 :(得分:0)

O(m + n)比O(mn)快很多(一个数量级)。

O(m + n)算法可以是迭代2组并对每个元素进行恒定时间(O(1))运算的算法。

O(mn)算法可以是迭代第一组的算法,并对第二组中的匹配元素进行线性搜索(O(n))。

O(mn)算法可能是教授们称之为天真的方法