演算法基礎:動態規劃陣列中滾動陣列的使用
這篇文章繼續在前一篇文章的基礎上介紹動態規劃陣列的優化方式。很多基礎演算法本來都是寫給我家的小少年看的,結果發現後浪學習的速度遠遠超出我的想象,在一個週末用這篇文章來紀念一下吧。
斐波那契數列
斐波那契數列:
f(n) = f(n-1) + f(n-2) (n>1)
f(0) = 1
f(1) = 1
dp陣列方式實現
int fibonacci(int n) {
if (n == 0 || n == 1) return dp[n]=1;
if (dp[n] != -1) return dp[n];
return dp[n]=fibonacci(n-1)+fibonacci(n-2);
}
詳細可參看:https://liumiaocn.blog.csdn.net/article/details/109397755
計算次數的證明
自從發現少年已經自己會用spfa這樣的東西來解決問題之後,這種基礎的內容應該就不能發給他看了,所以簡單確認了一下動態規劃法到底解決了什麼問題,為什麼實際上加法的執行次數是fibonacci(n)-1,結果二十分鐘左右用歸納法就證明完了,除了結尾的fib(n)-1應該是fib(n+1)-1,基本似乎是對的。
動態規劃法解決
後浪看完給他寫的基礎教程,說這還可以用滾動陣列優化一下,給了個圖,使用Java方式1ms計算的斐波那契45的計算結果。
滾動陣列的使用
- 第一種方式:使用&1
#define FIBONACCI_MAX 2
int dp[FIBONACCI_MAX] = { 0 };
int fibonacci(int n) {
dp[0]=1,dp[1]=1;
for (int i=2; i<=n; i++) dp[i&1] = dp[(i-1)&1] + dp[(i-2)&1];
return dp[n&1];
}
程式碼說明:和1進行&的操作,只會有0和1兩個下標,因為此示例中使用的情況在求解的時候只是用到了n-1和n-2,這種大概是最節省的做法了,將本來長度為n的空間降到常量2.
- 第二種方式:使用求餘
#define FIBONACCI_MAX 2
int dp[FIBONACCI_MAX] = { 0 };
int fibonacci(int n) {
dp[0]=1,dp[1]=1;
for (int i=2; i<=n; i++) dp[i%FIBONACCI_MAX] = dp[(i-1)%FIBONACCI_MAX] + dp[(i-2)%FIBONACCI_MAX];
return dp[n%FIBONACCI_MAX];
}
程式碼說明:和第一中方式如出一轍,但是由於第一種和1進行&的情況只有兩種狀態,雖然可以解決大部分問題,但是如果有三個狀態需要使用的情況就會比較困難,可以考慮使用%,本質上是確認滾動時到底需要幾個元素進行運算。
總結
看到一個之前從來沒有接觸過計算機的少年在繁重的大學課程學習之餘1個月不到的時間從對程式設計一無所知到可以較為熟練使用Java和C進行滾動陣列/常見排序/鄰接矩陣/最短路徑等演算法進行實現,覺得很是欣慰和開心,真心感覺計算機演算法教育實際應該從初高中開始執行比較好。
相關文章
- 動態規劃使用一維陣列要注意的問題動態規劃陣列
- DP 動態規劃入門 一維陣列動態規劃陣列
- 動態陣列陣列
- 2-7 陣列:動態陣列陣列
- C++基礎回顧4——動態陣列C++陣列
- 陣列004 動態建立一維陣列陣列
- 陣列基礎使用陣列
- 建立動態陣列陣列
- 靜態動態陣列陣列
- JavaScript基礎——使用陣列JavaScript陣列
- List介面(動態陣列)陣列
- 矩陣連乘(動態規劃演算法)矩陣動態規劃演算法
- 手動實現ArrayList動態陣列陣列
- [JAVA] Java 陣列、多維陣列,動態、靜態初始化,陣列JVM記憶體模型分析Java陣列JVM記憶體模型
- shared_ptr和動態陣列陣列
- JavaScript基礎(五)陣列JavaScript陣列
- 樹狀陣列基礎陣列
- golang基礎之陣列Golang陣列
- 陣列演算法-差分陣列陣列演算法
- Solidity中函式返回值,靜態動態陣列Solid函式陣列
- mORMot 1.18 第13章 動態陣列ORM陣列
- AUTOCAD——拉伸陣列組合動態塊陣列
- ArrayList動態陣列物件 c# 1231陣列物件C#
- Java陣列03:陣列使用Java陣列
- 動手編寫—動態陣列(Java實現)陣列Java
- 《Java從入門到失業》第三章:基礎語法及基本程式結構(3.9):陣列(陣列基本使用、陣列的迴圈、陣列拷貝、陣列排序、多維陣列)Java陣列排序
- 6-Java基礎語法-陣列之一維陣列Java陣列
- java大陣列劃分為若干小陣列Java陣列
- 演算法基礎--遞迴和動態規劃演算法遞迴動態規劃
- JAVA基礎--二維陣列Java陣列
- NumPy 基礎 (一) - 建立陣列陣列
- C語言動態陣列小作業C語言陣列
- 陣列的使用陣列
- 陣列元素劃分陣列
- 陣列二:使用陣列可變函式為陣列排序陣列函式排序
- 矩陣連乘問題 Python 動態規劃矩陣Python動態規劃
- 陣列使用陣列
- Js陣列物件的屬性值升序排序,並指定陣列中的某個物件移動到陣列的最前面JS陣列物件排序