關於斐波那契數列計算引發的效率思考

2021-08-28 20:29:34 字數 871 閱讀 3563

斐波那契數列的演算法如下:

int fibonaccifunc(int val)

演算法上並不複雜,就是乙個遞迴。但是遞迴一直在呼叫自己,這就要涉及到建棧和銷棧,開銷是很大的,特別當需要不斷的呼叫這個遞迴做運算的時候,那消耗的資源、占用的時間,將不能被忽視。突然看到這個問題,開始考慮如何減少這個開銷。當然,這個思考的方案與斐波那契數列中隱藏的矩陣思想無關。我們考慮乙個概率的問題。一般處理實際情況的時候,有很多資料將會是重複的,會有一定的出現概率,我們就從這一點入手。

1、可調配的資源夠多的前提下:

鍊錶是最好的選擇

typedef struct _fibonacci_val_map

fibonacci_val_map;

每次在計算之前,查詢鍊錶是否有命中資料。如果沒有命中就計算資料,並且插入到列表的開頭。

等到程式執行的時間足夠長,那麼幾乎實際情況中的值都能在鍊錶中找到。此時效能的瓶頸將會出現在鍊錶查詢上。比如用樹來查詢?進一步優化一下?不管是鍊錶查詢核實後優化後的樹查詢。都比之前的的遞迴消耗在建棧銷棧上,鍊錶查詢更多的是消耗在暫存器的取值賦值。這兩者消耗的時間不是乙個數量級的

2、資源少的情況:

那就陣列吧固定好陣列的大小,

typedef struct _fibonacci_val_map

fibonacci_val_map;

fibonacci_val_map target_map[10];

查詢的方案如之前的鍊錶的查詢,命中的成員與首位互換。未命中的新增到首位,之前的資料都後移,自動丟棄最後一位(命中概率最低)。

3、其他的優化方案還沒有想到。空手套前輩們的白狼。手動滑稽.jpg

斐波那契數列計算 B

描述 斐波那契數列如下 f 0 0,f 1 1 f n f n 1 f n 2 編寫乙個計算斐波那契數列的函式,採用遞迴方式,輸出不超過n的所有斐波那契數列元素 呼叫上述函式,完成如下功能 使用者輸入乙個整數n,輸出所有不超過n的斐波那契數列元素 輸出數列的元素和及平均數,輸出按照順序,用英文逗號和...

斐波那契數列 計算前字尾

hdu3117 求 0,1e8 的f n 的前後4位。輸入 35 3637 3839 4064 65輸出 9227465 14930352 24157817 39088169 63245986 1023.4155 1061.7723 1716.7565 通項公式 f n 1 sqrt 5 減號後面的...

python實現 斐波那契數列計算

斐波那契數列如下 f 0 0,f 1 1 f n f n 1 f n 2 編寫乙個計算斐波那契數列的函式,採用遞迴方式,輸出不超過n的所有斐波那契數列元素 呼叫上述函式,完成如下功能 使用者輸入乙個整數n,輸出所有不超過n的斐波那契數列元素 輸出數列的元素和及平均數,輸出按照順序,用英文逗號和空格分...