簡體   English   中英

O(m + n)和O(mn)之間的差異?

[英]Difference between O(m+n) and O(mn)?

我試圖通過不同的方法找到算法的復雜性。 在數學上我遇到了一個O(m + n)和另一個O(mn)方法。 但是,我無法掌握或說出這一點。 這不像是我看着他們並得到“啊!這就是發生了什么”的感覺! 有人可以使用他們自己的例子或任何其他工具解釋這個嗎?

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)

我建議看一下這個問題/答案 ,以便了解最后的過渡。

對於O(mn)

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

我對尋找直覺的建議被認為是如下實驗:

首先,要意識到m和n是輸入的兩種不同測量值 它們可能是兩個輸入流的長度,矩陣邊長,或同一數據結構的兩個不同屬性的計數,例如同一圖的邊和節點數,或任何類似的度量。

直覺是big-O用簡單函數表示算法的真實運行時間(或者其他一些方面,如比較計數或所需空間)的界限 - 調用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的額外常數因子(與上述兩種算法相比,它在小輸入上可能非常慢):

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)。 如果實際運行時間受到增長較慢的函數的限制,那么它也受到所有增長速度較快的函數的限制。

然而,人們常常說“這個算法是O(n)”,而意味着界限很 也就是說,對於某些常數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整數的數組上擊敗它。

O(m + n)比O(mn)快很多( 一個數量級 )。

O(m + n)算法可以是迭代2個集合並對每個元素執行恆定時間(O(1))操作的算法。

O(mn)算法可以是迭代第一組並對第二組中的匹配元素進行線性搜索(O(n))的算法。

O(mn)算法可能就是教授們稱之為“天真的方法”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM