簡體   English   中英

為什么該算法的Big-O復雜度為O(n ^ 2)?

[英]Why is the Big-O complexity of this algorithm O(n^2)?

我知道此算法的大O復雜度是O(n^2) ,但我不明白為什么。

int sum = 0; 
int i = 1; j = n * n; 
while (i++ < j--) 
  sum++;

即使我們在開始時設置j = n * n ,我們在每次迭代過程中都將i遞增和j遞減,因此得出的迭代次數是否不應該比n*n小很多?

在每次迭代期間,您將i遞增並遞減j ,這等效於將i遞增2。因此,迭代的總數為n ^ 2/2,仍然為O(n ^ 2)。

big-O復雜度忽略系數。 例如: O(n)O(2n)O(1000n)都是相同的O(n)運行時間。 同樣, O(n^2)O(0.5n^2)均為O(n^2)運行時間。

在您的情況下,實際上每次循環都會使循環計數器增加2(因為j--i++具有相同的作用)。 因此,您的運行時間為O(0.5n^2) ,但是與刪除系數時的O(n^2)相同。

您將精確地進行n*n/2循環迭代(如果n為奇數,則為(n*n-1)/2 n )。 在大O表示法中,因為常量因子“不計算”,所以O((n*n-1)/2) = O(n*n/2) = O(n*n)

您的算法相當於

while (i += 2 < n*n) 
  ...

O(n^2/2)O(n^2)相同,因為大的O復雜度不關心常量。

令m為迭代次數。 然后,

i + m = n ^ 2-m

這使,

m =(n ^ 2-i)/ 2

在Big-O表示法中,這意味着O(n ^ 2)的復雜性。

是的,該算法為O(n ^ 2)。

為了計算復雜度,我們有一張表復雜度:

O(1)O(log n)O(n)O(n log n)
O(n²)O(n ^ a)O(a ^ n)O(n!)

每行代表一組算法。 一組算法在O(1)中,也在O(n)和O(n ^ 2)中,等等。但是不是相反的。 因此,您的算法實現了n * n / 2個句子。

O(n)<O(nlogn)<O(n * n / 2)<O(n²)

因此,因為O(n)和O(nlogn)較小,所以包含算法復雜度的一組算法為O(n²)。

例如:對於n = 100,總和=5000。=> 100 O(n)<200 O(n·logn)<5000(n * n / 2)<10000(n ^ 2)

對不起我的英語。

即使我們在一開始就設置了j = n * n,我們還是在每次迭代過程中增加i並減少j,所以迭代的結果數目是否不應該比n * n小很多?

是! 這就是為什么它是O(n ^ 2)。 按照相同的邏輯,它比n * n * n很多 ,這使其變為O(n ^ 3)。 按照類似的邏輯,它甚至是O(6 ^ n)。

big-O為您提供有關上限的信息。

我相信您正在嘗試詢問為什么復雜度是theta(n)或omega(n),但是如果您只是想了解big-O是什么,那么您真的需要了解它首先給函數帶來了上限 ,最重要的

暫無
暫無

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

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