我有兩個Project Euler問題2的解決方案,即找到所有連平均斐波那契數小於400萬的總和。混淆求偶數斐波那契數的和運行時間
解決方法一(這需要11000毫微秒的平均值):
public class Solution {
static long startTime = System.nanoTime();
static final double UPPER_BOUND = 40e5;
static int sum = 2;
public static int generateFibNumber(int number1, int number2){
int fibNum = number1+ number2;
return fibNum;
}
public static void main(String args[]) {
int i = 2;
int prevNum = 1;
while(i <= UPPER_BOUND) {
int fibNum = generateFibNumber(prevNum,i);
prevNum = i;
i = fibNum;
if (fibNum%2 == 0){
sum += fibNum;
}
}
long stopTime = System.nanoTime();
long time = stopTime - startTime;
System.out.println("Sum: " + sum);
System.out.println("Time: "+ time);
}
和溶液2(這需要14000毫微秒的平均值):
public class Solution2 {
static long startTime = System.nanoTime();
final static int UPPER_BOUND = 4_000_000;
static int penultimateTerm = 2;
static int prevTerm = 8;
static int currentTerm = 34;
static int sum = penultimateTerm+ prevTerm;
public static void main(String args[]) {
while (currentTerm <= UPPER_BOUND) {
sum+= currentTerm;
penultimateTerm = prevTerm;
prevTerm = currentTerm;
currentTerm = (4*prevTerm) + penultimateTerm;
}
long stopTime = System.nanoTime();
long time = stopTime - startTime;
System.out.println("Sum: " + sum);
System.out.println("Time: " + time);
}
爲什麼溶液中的兩種時間要長時我在while循環內執行的迭代次數更少,並且也沒有if語句? 這可以更有效地完成嗎?
您的計時碼不正確;您應該在進入while循環之前在main方法中啓動計時器,而不是作爲字段初始值設定程序。 – Asik
就是這樣。第一個是3400納秒,第二個是3000。這是我期待的(第二個更快) –
它沒有任何價值,你沒有執行足夠的迭代來預熱JVM。這意味着你正在處理翻譯如何表現的變幻莫測。注意:可以通過使用每第三個斐波那契數爲偶數來減少數字迭代(這會將迭代次數減少三分之一) –