演算法在ros中應用 快取思想在演算法設計中的應用

2021-10-16 06:30:11 字數 1398 閱讀 9837

斐波那契數列(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年起出版了以《斐波納契數列季刊》為名的乙份數學雜誌,用於專門刊載這方面的研究成果。

直接根據遞推關係式,我們可以設計常規的遞迴演算法:

if n=1 return 1if n=2 return 2if n>2 return fibonacci(n-1)+fibonacci(n-2)
在這個方法中包含了大量重複的計算,比如在計算fibonacci(n)時需要計算一次fibonacci(n-2)的值,在計算fibonacci(n-1)時仍然要計算一次fibonacci(n-2)的值,問題的規模和計算的次數呈現如下的關係:

問題規模及計算次數

3:count(4)+count(5)

4:count(5)+count(6)

5:count(6)+count(7)

n-3:count(n-1)+count(n-2)=3

n-2:count(n-2)=2

n-1:count(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]
借助陣列做資料快取中間結果值,可以大大提公升演算法的執行效率。當然,對於斐波那契數列本身還有很多更好的優化方法,比如使用迭代進行一趟迴圈,或者借助斐波那契的矩陣乘法定義進行優化等。我們這裡只是用這個例子來說明快取在演算法優化中的應用。

現在我們把關注點回到快取思想上來。從對斐波那契數列的優化過程中可以看到,快取是典型的以空間換取時間的策略。在計算機的設計與程式設計過程中,快取是一種經常用到的思想。

快取思想在演算法設計中的應用

斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的方法定義 f 1 ...

A 演算法在OI中的應用

1.a 演算法 我們普通的搜尋演算法往往複雜度都是指數級,oi中這樣的複雜度無法滿足我們的要求。這時我們一般都會進行一些剪枝優化,但在有些題目中卻可以有更加巧妙的方法 a 演算法。a 演算法作為一種基礎的啟發式搜尋,它不同於dfs和bfs將所有情況進行遍歷,它能從所有情況中選出較優的再進行遍歷。因此...

Lru演算法在Android中的應用

對於lru演算法的理解 lru演算法,將命中率不高的空間釋放掉,保留命中率較高的空間。這種演算法有一種實現方式 建立的物件通過佇列儲存起來,如果對乙個物件進行了訪問,就將這個物件放到佇列的開頭,新加入的物件也會放在佇列的開頭 也就是說,佇列開頭一定是新加入的或者是常用的物件 當佇列長度超過了限額時,...