簡體   English   中英

具有if語句的嵌套循環的時間復雜度O(N):O(N ^ 4)?

[英]Time complexity O(N) of nested loops with if-statement: O(N^4)?

我試圖找出這個片段的big-O方面的嚴格限制:

for(int i = 1 ; i <= n ; i++) {
    for(int j = 1; j <= i*i ; j++) {
        if (j% i == 0){
            for(int k = 0 ; k<j ; k++ )
                sum++;
        }
    }
}

如果我們從最內層循環開始,它將在最壞的情況下運行k = n ^ 2次,這占O(N ^ 2)。 每次j = m * i時,if語句都為真,其中m是任意常數。 由於j從1運行到i ^ 2,這將發生在m = {1,2,...,i}時,這意味着它將是真的i次,並且我最多可以是n,所以最壞的情況將是是m = {1,2,...,n} = n次。 如果i = n,則第二個循環應該具有O(N ^ 2)的情況。 外環具有O(N)的最差情況復雜度。

我認為這將以下列方式組合:內部循環的O(N ^ 2)*第二循環的O(N ^ 2)*外部循環的O(N)給出O的最壞情況時間復雜度( N R個5)

但是,if語句保證我們只會到達內循環n次,而不是n ^ 2。 但無論如何,我們仍然需要經歷外循環n * n ^ 2次。 if-test是否會影響代碼段的最壞情況時間復雜度?

編輯:修正了j到i ^ 2,而不是我。

您可以通過在沒有if情況下重寫循環來簡化分析,如下所示:

for(int i = 1 ; i <= n ; i++) {
    for(int j = 1; j <= i ; j++) {
        for(int k = 0 ; k<j*i ; k++ ) {
            sum++;
        }
    }
}

這消除了條件跳過循環的“有效載荷”的步驟。 這個等效的循環系統的復雜性是O(n 4 )。

    I analyse your question in a more straightfroward way
    we first start by fix i as a costant, 
    for example, assume it to be k,
    so j=1~k^2, when j=k,2k,3k,...,k^2, assume j to be c*k (c=1~k)
    the next loop will be executed c^2 times, 
    so the complexity for a fix i can be expressed as=>
    (1+.....+1)+(1+1+...+2^2)+(1+1+...+3^2)+.....+(1+1+...+k^2)
    = O(k^3)
    so now we set k to be 1~n, so the total complexity will be O(n^4)

暫無
暫無

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

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