[英]Why is this caterpillar algorithm O(n^2) not O(n^3)?
有人可以解釋為什么這個算法是O(n^2)
? 根據這個 ,它是O(n ^ 2)。 我認為它是O(n ^ 3)的原因是因為外環(對於x)運行n
次,內環(對於y)運行n-1
次,並且在最壞的情況下例如A = [8, 100, 101, 102, 103, 104, 105, 106, 107]
,while循環(對於z)將運行n-2
次,因此整體為O(n^3)
。
為了完整性, A
是具有正元素的排序數組,如果A[x] + A[y] > A[z]
,則三元組(x,y,z)是三角形。 找出可以從A構建多少個三角形。
int TrianglesCount(int[] A)
{
int result = 0;
for (int x = 0; x < A.Length; x++)
{
int z = x + 2;
for (int y = x + 1; y < A.Length; y++)
{
while (z < A.Length && A[x] + A[y] > A[z])
z++;
result += z - y - 1;
}
}
return result;
}
讓我們仔細看看下面的代碼片段
int z = x + 2;
for (int y = x + 1; y < A.Length; y++)
{
while (z < A.Length && A[x] + A[y] > A[z])
z++;
result += z - y - 1;
}
for循環顯然是執行A.lenght - (x+1)
次,即O(n)
。 然而,內部while循環最多執行A.length - (x+2)
次,因為每次執行都會增加z
值,並且它最多可以遞增A.length - (x+2)
次,直到while條件失敗了。 同樣,這至多是O(n)
。 因此,該片段的總時間復雜度可以由O(n) + O(n) = O(n)
限定。
由於針對x
每個O(n)
值運行片段,因此總時間復雜度為O(n^2)
。
在KMP算法中使用類似的想法進行字符串匹配。
您應該注意z
在x循環內初始化,而不是y循環。 並且在每次x迭代時, z
可以增加最大值A.length - x - 2
次。
訣竅在於z
in total
增加到A.Length:例如,如果我們在第一次迭代中運氣不好:
以下是我對此的解釋。
首先,當n很小時,你不能談論復雜性。 復雜性的定義本身表明,當n傾向於無窮大時,復雜性只是“意味着什么”。 例如,具有3個元素的數組上的冒泡排序可能看起來像O(n)。
從這個等式中取出,這是關於你的算法:
變量z在x循環內聲明,而不是y循環,因此每次y循環完成時z都不會重新初始化。 這意味着在x循環的每次傳遞中z將僅增加到A.length。 一旦z達到A.length,它將不再增加,因此它不依賴於y循環。 我希望這個解釋是充分的,現在這個問題對你來說更清楚了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.