php数组o m n mn,O(m + n)和O(mn)之间的区别?
小編典典
我對發現直覺的建議是思想實驗,如下所示:
首先,認識到m和n是 輸入的 兩個 不同度量
。它們可能是兩個輸入流的長度,矩陣邊的長度,或同一數據結構的兩個不同屬性的計數,例如同一圖形的邊和節點計數,或任何類似的度量。
直覺是big-O用一個簡單的函數-稱R(m,n)-乘以某個值來表示算法的 真實
運行時間(或其他方面,例如比較計數或所需空間)的界限。任意常數。我們忽略了常數因素,并通過調用運行時間O(R(m,n))來考慮所有以同一R為界的算法。
因此,大O(m + n)表示,對于合適的大m和n,實際運行時間受某個函數R(m,n)= C(m +
n)限制。對于圖示例,這表示算法的實際運行時間將受頂點和邊的數量之和的倍數限制。
您可以將邊界函數看作是3d中具有軸m,n和R(m,n)的圖形。或者您可以想到圖表:
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
作為3d圖形,第一個函數是一個平面,第二個函數是在幾乎所有點上都快得多的增長函數。這意味著,如果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(mn)相比,O(m + n)的約束似乎受約束的程度要小。但是看一下m = n = 100的情況。此處,在O(m +
n)算法上的界限是3(m + n)=600。但是常數較小的O(mn)算法的界限mn =10000。顯然,如果m和n大,則您要第一個。
@Anonymous在本文的初始版本中提出了一個很好的觀點,它混淆了big-O和big-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)成比例。
最后我要補充一點,在許多情況下,您不能忽略常量。文獻中存在許多算法,它們比通常使用的算法漸近“快”,但是常數太大,以至于實際問題的規模總是太慢。計算幾何有很多例子。基數2排序是另一種。它是Theta(n),但實際上,一個好的快速排序(Theta(n
log n)平均大小)將在大小至少為10 ^ 8的整數數組上勝過它。
2020-07-28
總結
以上是生活随笔為你收集整理的php数组o m n mn,O(m + n)和O(mn)之间的区别?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python判断字符_Python判断字
- 下一篇: Java 平台有哪几个版本?