斐波那契數列(fibonacci sequence),又稱**分割數列、因數學家列昂納多·斐波那契(leonardoda fibonacci)以兔子繁殖為例子而引入,故又稱為「兔子數列」,指的是這樣乙個數列:1、1、2、3、5、8、13、21、34、……在數學上,斐波納契數列以如下被以遞推的方法定義:f(1)=1,f(2)=1, f(3)=2,f(n)=f(n-1)+f(n-2)(n>=4,n∈n*)在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用,為此,美國數學會從2023年起出版了以《斐波納契數列季刊》為名的乙份數學雜誌,用於專門刊載這方面的研究成果。直接根據遞推關係式,我們可以設計常規的遞迴演算法:
fibonacci(n)
if n=1 return 1
if n=2 return 2
if n>2 return fibonacci(n-1)+fibonacci(n-2)
在這個方法中包含了大量重複的計算,比如在計算fibonacci(n)時需要計算一次fibonacci(n-2)的值,在計算fibonacci(n-1)時仍然要計算一次fibonacci(n-2)的值,問題的規模和計算的次數呈現如下的關係:
問題規模為n時子問題的計算次數
問題規模
計算次數
1和2count(3)+count(4)
3count(4)+count(5)
4count(5)+count(6)
5count(6)+count(7)
n-3count(n-1)+count(n-2)=3
n-2count(n-2)=2
n-1count(n-1)=1
可以發現問題規模n的計算次數形成了一種「倒序」排列的斐波那契額數列,解決問題的所需要的計算次數和原問題呈現出相同的規模,執行效率會特別的慢。
事實上,我們可以使用乙個陣列快取下已經計算的子問題的值,當子問題被再次用到時,直接使用快取的值即可,避免重新計算,從而提公升效率。
初始化陣列 a[1..n]=
fibonacci(n,a)
if n=1 return a[1]
if n=2 return a[2]
if n>2
a[n]=(a[n-1]=0?fabonacci(n-1):a[n-1])+(a[n-2]=0?fabonacci(n-2):a[n-2])
return a[n]
借助陣列做資料快取中間結果值,可以大大提公升演算法的執行效率。當然,對於斐波那契數列本身還有很多更好的優化方法,比如使用迭代進行一趟迴圈,或者借助斐波那契的矩陣乘法定義進行優化等。我們這裡只是用這個例子來說明快取在演算法優化中的應用。
現在我們把關注點回到快取思想上來。從對斐波那契數列的優化過程中可以看到,快取是典型的以空間換取時間的策略。在計算機的設計與程式設計過程中,快取是一種經常用到的思想。
綜上比較,快取思想的應用可以分成兩個方面:一是,在速度相差比較大的軟體/硬體之間,用以協調二者的速度差異,提公升整體的吞吐率,比如計算機系統中的高速緩衝儲存器;二是,對計算資源消耗較大的中間結果做快取,以避免重複計算,比如資料庫連線池中對連線物件的快取避免重複對物件的建立,以及上述我們在優化斐波那契數列時對子問題中間結果的快取等。
演算法在ros中應用 快取思想在演算法設計中的應用
斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的方法定義 f 1 ...
應用程式中的快取 Cache 設計
cache 快取 機制是計算機中很重要的思想,從計算機硬體中的快取記憶體快取,到作業系統中的虛擬記憶體管理都應用到了cache。因此在應用程式的開發中,我們也會很自然的想到用cache來進行某些區域性的優化。比如設計乙個用於存放檔案指標的快取,以避免每次讀檔案的時候再從磁碟開啟檔案。本文將介紹如何設...
貪心演算法的設計思想
貪心演算法在解決問題的策略上目光短淺,只根據當前已有的資訊就做出選擇,而且一旦做出了選擇,不管將來有什麼結果,這個選擇都不會改變。換言之,貪心法並不是從整體最優考慮,它所做出的選擇只是在某種意義上的區域性最優。貪心演算法對於大部分的優化問題都能產生最優解,但不能總獲得整體最優解,通常可以獲得近似最優...