簡體   English   中英

為什么 2 for 循環的時間復雜度不是 O(n*2^n)?

[英]Why is the time complexity of 2 for loops not O(n*2^n)?

根據我的教授,此方法的時間復雜度為O(2^n)

我覺得這個方法的時間復雜度應該是O(n * 2^n)因為

外部 for 循環成本O(n)

內部 for 循環成本O(2^n)

public static int loop(int n) {
    int j = 1;
    for (int i = 0; i < n; i++) {
        for (int k = j; k > 0; k--) {
            System.out.println("Hello world");
        }
        j *= 2;
    }
    return j;
}

考慮一下:

對於i = 0 : j = 1 -> 2^0

對於i = 1 : j = 2 -> 2^1

對於i = 2 : j = 4 -> 2^2

對於i = 3 : j = 8 -> 2^3 ....

對於i = n-1 : j = 2^n-1

如果您添加所有這些:

2^0 + 2^1 + 2^2 +.....+2^(n-1) => order of 2^(n) -> 2^(n) - 1 to be precise

所以時間復雜度是O(2^n)

外循環運行 O(n) 次是正確的。 您也正確的是,內循環完成所需的最長時間為 O(2 n )。 所以說這里完成的工作不超過 O(n2 n ) 並沒有錯。

然而,這個界限並不嚴格,因為該分析假設內循環的每次迭代所做的工作等於每次迭代內循環所做的最大工作。 類比推理:如果我有 10 只動物,其中最重的是一頭 1,000 公斤的大象,我可以正確地說,通過將動物數量乘以最大質量,這些動物的總重最多為 10,000 公斤,但這可能是高估了. 我最好把每只動物的質量加起來看看我得到了什么。

在這種情況下,我們需要的觀察是,我們經過該內部循環的第 i 次,我們花費了 2 i次迭代。 這意味着完成的總工作量大約是

2 0 + 2 1 + ... + 2 n-1

這是幾何級數的總和,結果為 2 n - 1,因此總時間為 O(2 n )。 回到動物的例子,如果我的動物是一只 1 公斤的松鼠、一只 10 公斤的烏龜、一只 100 公斤的人和一頭 1,000 公斤的大象,那么幾乎整個質量都被大象占了,因為質量增長得很快。 幾何級數和的形式表達式使這個想法在數學上是嚴謹的。

暫無
暫無

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

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