如何判斷是否將兩個額外的任務在迭代是,如果條件測試另一件事昂貴或設置?這裏我詳細說明。問題是生成並打印n> = 1的斐波那契數列的前n項。我用C實現是:算法效率 - 如果需要更多的比較,部分展開循環是否有效?
#include<stdio.h>
void main()
{
int x=0,y=1,output=0,l,n;
printf("Enter the number of terms you need of Fibonacci Sequence ? ");
scanf("%d",&n);
printf("\n");
for (l=1;l<=n;l++)
{
output=output+x;
x=y;
y=output;
printf("%d ",output);
}
}
但是這本書的作者「如何用計算機解決它」說,這是低效的,因爲它使用了兩個額外的任務爲產生一個Fibonacci數。他建議:
a=0
b=1
loop:
print a,b
a=a+b
b=a+b
我同意這是更有效,因爲它使a和b相關的所有的時間和一個分配生成一個號碼。但它一次打印或提供兩個斐波納契數字。假設問題是產生奇數個術語,我們會做什麼?筆者建議設置一個測試條件來檢查n是否爲奇數。我們不會因爲在每次迭代中增加if測試而失去減少分配數量的收益嗎?
定義「高效」。它對漸近複雜性沒有任何影響,當使用優化編譯器時,它可能非常好地*無*差* *,即使它們有差別,它也會變得非常微小,並且小於(小於一萬倍) I/O開銷。 – delnan
判斷它是否「昂貴」的唯一方法是分析這兩個版本。 –
什麼可能造成可衡量的差異是它允許在一個打印語句中打印兩個數字。正如@delnan所說的那樣,與I/O成本相比,額外變量(如果編譯器不會優化這些變量)和分配(也包括檢查)的成本是微不足道的。 –