簡體   English   中英

大O符號(復雜度)

[英]Big O notation (Complexity)

這個循環的最大作用是什么? ->我知道循環本身將執行n次。 但是循環中的任務也會執行n次,對嗎? 那么,這將使它成為O(n ^ 2)還是我不將它們與其簡單的O(n)結合起來? 我個人認為這只是O(n),因為這是循環執行的次數,但是我想澄清一下為什么或為什么不這樣做? 在我為期中考試做准備時,任何解釋都將有所幫助。

for(int i = 0; i < a.length;i++){
        a[i] = b[i]
    }

考慮一下循環中的代碼執行了多少次。 每個a[i] = b[i]發生a.length次,我們將其稱為n 所以這是O(n)

循環執行n次,語句執行n次

但是n + n + n = 3n(大約)= k * n,其中k是恆定步長,仍然是O(n)

該循環為O(n) ,其中n是數組的長度。

您在循環內執行的運算為O(1) ,但由於您的循環而重復了n次,因此總計為O(1*n) = O(n)

例如,以下代碼為O(n^2)

for(int i = 0; i < n; i++) {
  for (int j = 0; j < n; j++) {
    a[i][j] = i+j;
  }
}

我們再次從內到外進行分析。 內部語句為O(1) ,但這由j-for循環執行了n次。 這導致內部(j)for循環為O(n) 接下來,我們將這個for循環運行n次,以使整個程序的O(n*n) = O(n^2)

這是否有助於回答您的問題?

那么,這將使它成為O(n ^ 2)還是我不將它們與其簡單的O(n)結合起來?

只要循環中的代碼在恆定時間內執行(因此沒有其他循環或遞歸函數調用),您就可以忽略它。 不管您在循環中正在做什么,它都是O(n)。

查看Big-O表示法的一種好方法是,它表示算法的擴展方式

對於算法中的每個元素輸入,必須采取多少對計算有意義的步驟才能產生所需的輸出。 在此示例中,您的“在計算上有意義的步驟”是將b [i]的值分配給a [i]。 顯然,這種情況發生的次數與數組中的元素次數一樣多。 或抽象化它:它發生的次數與input元素的發生次數一樣多 現在您可以了解為什么它是O(n)算法。

使其變為O(n ^ 2)的一個小修改是進行雙嵌套循環,其中對於每個輸入元素,必須將整個數組加在一起。

for(int i = 0; i < a.length;i++){
        for(int k = 0; k < b.length; k++) {
             a[i] += b[k]
        }
}

現在您可以看到,對於每個輸入元素,我們都執行多個操作(m個操作,其中m是b數組的大小。)

作為有關Big-O符號的最后說明,這些符號有很多種(包括theta等)。 Big-O報告給定算法的最大縮放比例。 從技術上講,這意味着您可以將算法描述為O(n ^ 50)且正確無誤-這並不是您的老師可能會喜歡的答案。 您想要盡可能接近縮放比例。

暫無
暫無

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

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