[英]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.