簡體   English   中英

O(nk)和O(n + k)在時間復雜度上有什么區別?

[英]what is the difference between O(nk) and O(n+k) in time complexity?

在算法分析中時間復雜度的大O表示法中,當算法依賴於n和k時,這兩個符號之間的區別是什么。 如果有一個嵌套循環,外循環運行n次,內循環運行k次,請幫助使用符號?

O(NK):

for( i=0; i<n; i++ ) {
   for( j=0; j<k; j++ )
   {}
}

O(N + K):

for( i=0; i<n; i++ )
{}

for( j=0; j<k; j++ )
{}

O(n + k)表示nk中較大的線性生長速率。 假設n更大。 然后

n + k <= n + n = 2n = O(n)

但是,如果n更小,那么

n + k <= k + k = 2k = O(k).

無論n是否更大,它總是如此

n + k = O(n+k)

所以這種符號有助於隱藏這種不確定性。 這種雙變量符號對於圖算法是有用的,使用n表示頂點數, m表示邊數。 您可以編寫一個表達式O(n + m)來表示該算法對於稀疏圖(m = Theta(n))是O(n),但對於更密集的圖(例如,O(n ^ 2)則更慢。 m = Theta(n ^ 2))。

對於第二個問題,它只是簡單的算術。 在外循環的第一次迭代中迭代內循環k次,對於第二次循環迭代k次等,總共k + k + ... + k = n * k個總操作,即O(nk)。

O(nk)表示所需的時間與n * k成正比。 O(n + k)表示所需的時間與n + k成正比。 這正是它的樣子。 在您的問題中,您需要更具體地了解您不理解的內容。

在您的情況下,算法的運行時為O(nk),因為內部循環總共運行n * k次。

應該清楚的是,這些是不同的,例如,如果n = k:

O(NK)= O(NN)= O(N ^ 2)

O(N + K)= O(2N)= O(n)的

假設函數f(n)O(g(n))意味着存在一些常數q,使得對於n的所有值不小於1, f(n)將不大於qg(n)

相反,假設函數f(x,y)O(g(x,y))意味着存在一些常數q,使得對於xy的所有值都不小於1, f(x,y)將不大於qg(x,y)

如果k是常數,那么上面的兩個值都等於O(n),因為對於k的任何值,對於任何不小於1的n ,如果設置q等於(k + 1) ,那么nk都不是nk對於任何n值不小於1, n + k將超過qn [ie (k + 1)n ]。

如果kn都是完全獨立的變量,則O(nk)是不可約的; O(n + k)將為O(max(n,k)),因為如果將q設置為等於2,則q(max(n,k))[即2max(n,k)]將大於或等於n + k中為它們是不低於一個nk的所有的值。

暫無
暫無

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

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