簡體   English   中英

為什么這個卡特彼勒算法O(n ^ 2)不是O(n ^ 3)?

[英]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:例如,如果我們在第一次迭代中運氣不好:

  • x = 0,y = 1,我們得到z從2到A.Length,在隨后的y循環中,z根本不會遞增。

以下是我對此的解釋。

首先,當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.

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