[英]Determining the exact number of executions of an algorithm
從代碼
int count = 0;
for(int i=1; i<=n; i++)
for(int j=1; j<=2*n; j=j+2)
for(int k=i; k<=j; k++)
count++;
可以將其轉換為語義等價的:
int count = 0;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
for(int k=i; k<=2*j - 1; k++)
count++;
如果在兩個代碼版本的末尾打印count
變量,它的值將是:
| loop 1 | loop 2
________________________________
N = 1 | 1 | 1
N = 2 | 6 | 6
N = 3 | 19 | 19
N = 4 | 43 | 43
N = 5 | 82 | 82
從第二個循環中,您提取了公式:
這在紙上是有道理的,但是,有一個問題。 將公式轉換為代碼:
public static int third_loop(int n ){
int count = 0;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
count += (2 * j - 1) - i + 1;
return count;
}
並顯示變量count
的值:
| loop 1 | loop 2 | loop 3
____________________________________
N = 1 | 1 | 1 | 1
N = 2 | 6 | 6 | 6
N = 3 | 19 | 19 | 18
N = 4 | 43 | 43 | 40
N = 5 | 82 | 82 | 75
count
數值現在不同了,其原因是會有 (2 * j - 1) < i + 1 的迭代,因此公式 (2 * j - 1) - i + 1 將產生負面結果,並將這些結果添加到變量count
。 在第二個循環中隱含地避免了一些事情。 如果將第三個循環更改為:
public static int fourth_loop(int n ){
int count = 0;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
count += Math.max((2 * j - 1) - i + 1, 0);
return count;
}
一個人會得到:
| loop 1 | loop 2 | loop 3 | loop 4
__________________________________________
N = 1 | 1 | 1 | 1 | 1
N = 2 | 6 | 6 | 6 | 6
N = 3 | 19 | 19 | 18 | 19
N = 4 | 43 | 43 | 40 | 43
N = 5 | 82 | 82 | 75 | 82
所以你的公式的問題是它也考慮了負值,而你的代碼沒有。 因為,我沒有數學工具來給你精確的公式,所以我請你的來自math.stackexchange的朋友這樣做。
編輯:從我提供的賞金中,馬修塔得出了以下確切的表達:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.