簡體   English   中英

這些嵌套循環的大O.

[英]Big-O of These Nested Loops

我對Big-O領域很陌生,所以請耐心等待。 我一直在尋找它,但我仍然需要做很多工作才能完全理解它。
我在練習練習中遇到了這些嵌套的for循環,沒有任何解決方案,它們看起來很復雜。 所以,任何幫助將不勝感激。

1)

int sum=0;
for(int i=0; i < n^2; i++) { // n+1
    for(int j = n-1; j >= n-1-i; j–-) { // n(n+1)/2 ?
        sum = i+j; // n(n+1)/2 ?
        System.out.println(sum); // n(n+1)/2 ?
    }
}

大O =?

2)

int sum=0;
for(int i=1; i <= 2^n; i=i*2) { // log(n)
    for(int j=0; j <= log(i); j++) { // log(n(n+1)/2) ?
        sum = i+j; // log(n(n+1)/2) ?
        System.out.println(sum); // log(n(n+1)/2) ?
    }
}

大O =?

3)

int sum = 0; int k = 23;
for(int i=k; i <= 2^(n−k); i=i*2) { // log(n)
    for(int j=2^(i−k); j < 2^(i+k); j=j*2) { // log(log(n)) ?
        sum = i+j; // log(log(n)) ?
        System.out.println(sum); // log(log(n)) ?
    }
}

大O =?

4)

int sum=0;
for(int i=2n; i>=1; i=i/2) {
    for(int j=i; j>=1; j=j/2) {
        sum = i+j;
        System.out.println(sum);
    }
}

大O =?


編輯:
- 更正了#4。 對不起,搞砸了。
- 日志的基數為2。
- 這里的^表示“對權力”,而不是xor。

stackoverflow (和答案) 有很多問題,如“嵌套循環的大O”

但是,你會得到我的回答。 但首先有一個符號問題:你將這個問題標記為java。 在代碼中我看到類似2ⁿ東西。 java中這意味着xor ,但我認為你的意思是Math.pow(2,n) ,所以對於這個答案,我將它視為冪運算符。

  1.  int sum=0; for(int i=0; i < n^2; i++) { // outer loop for(int j = n-1; j >= n-1-i; j–-) { // inner loop sum = i+j; // inner operations System.out.println(sum); } } 

    內部操作在O(1)運行,因此我只計算它們被調用的頻率。

    • 外環運行次。
    • 對於每個i (來自外循環),內循環運行i次。

    總共得到0+1+...+(n²-1)+n² = n²(n²+1)/2 這是Θ(n⁴)

  2.  int sum=0; for(int i=1; i <= 2^n; i=i*2) { // outer loop for(int j=0; j <= log(i); j++) { // inner loop sum = i+j; // inner operations System.out.println(sum); } } 
    • 外環運行n次,因為2⋅2⋅2⋅...⋅2n次)等於2 n
    • 假設對數的底數為2,內循環對於每個i = 2 k (1≤k≤n)運行k次。

    總共得到1+2+3+...+n-1+n = n(n+1)/2 這是Θ(n²)

  3.  int sum = 0; int k = 23; for(int i=k; i <= 2^(n−k); i=i*2) { // outer loop for(int j=2^(i−k); j < 2^(i+k); j=j*2) { // inner loop sum = i+j; // inner operations System.out.println(sum); } } 
    • 外部循環運行mm最小,使得k⋅2 m > 2 nk成立。 這可以寫成k⋅2 k ⋅2 m > 2 n k必須是positiv(否則外循環將永遠運行)。 假設kO(n)限定(常數也在O(n) ),則m也由O(n)界定。
    • 無論in是什么,內循環總是運行2⋅k次調整。 這是在O(1)對於恆定的k和在O(n)用於k所界定O(n)

    在總你O(n)為常數kO(n²)kO(n)

  4.  int sum=0; for(int i=2n; i>=1; i=i/2) { // outer loop for(int j=i; j>=1; j=j/2) { // inner loop sum = i+j; // inner operations System.out.println(sum); } } 
    • 外部循環運行log(n)次,就像情況2一樣(反過來)
    • 內循環運行j次(基本上)2的每個冪在12n之間。

    假設n = 2 k (意味着log(n) = k ),你總得到
    2 k+1 +2 k +2 k-1 +...+2 2 +2 1 +2 0 =2 k+2 -1=4n-1 所以這在O(n) 這也適用於n而不是2的冪。

使用Sigma表示法有條不紊地為迭代算法找到解決方案:

在此輸入圖像描述


使用base 2作為以下日志:

在此輸入圖像描述


在此輸入圖像描述


在此輸入圖像描述

暫無
暫無

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

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