[英]Big-O of These Nested Loops
我對Big-O領域很陌生,所以請耐心等待。 我一直在尋找它,但我仍然需要做很多工作才能完全理解它。
我在練習練習中遇到了這些嵌套的for循環,沒有任何解決方案,它們看起來很復雜。 所以,任何幫助將不勝感激。
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 =?
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 =?
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 =?
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ⁿ
或n²
東西。 在java中這意味着xor
,但我認為你的意思是Math.pow(2,n)
,所以對於這個答案,我將它視為冪運算符。
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)
運行,因此我只計算它們被調用的頻率。
n²
次。 i
(來自外循環),內循環運行i
次。 總共得到0+1+...+(n²-1)+n² = n²(n²+1)/2
。 這是Θ(n⁴)
。
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⋅...⋅2
( n
次)等於2 n 。 k
次。 總共得到1+2+3+...+n-1+n = n(n+1)/2
。 這是Θ(n²)
。
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); } }
m
倍m
最小,使得k⋅2 m > 2 nk
成立。 這可以寫成k⋅2 k ⋅2 m > 2 n
。 k
必須是positiv(否則外循環將永遠運行)。 假設k
由O(n)
限定(常數也在O(n)
),則m
也由O(n)
界定。 i
或n
是什么,內循環總是運行2⋅k
次調整。 這是在O(1)
對於恆定的k
和在O(n)
用於k
所界定O(n)
在總你O(n)
為常數k
和O(n²)
的k
在O(n)
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的每個冪在1
和2n
之間。 假設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.