動態規劃背後的基本思想非常簡單。就是將乙個問題拆分為子問題,一般來說這些子問題都是非常相似的,那麼我們可以通過只解決一次每個子問題來達到減少計算量的目的。
一旦得出每個子問題的解,就儲存該結果以便下次使用。
斐波那契數列就是從 0 和 1 開始,後面的數都是前兩個數之和
0,1,1,2,3,5,8,13,21,34,55,89…
那麼顯然易見,我們可以通過遞迴的方式來完成求解斐波那契數列
function
fib(n)
console.
log(
fib(10)
)//55
但是以上解法卻存在很嚴重的效能問題,當 n 越大的時候,需要的時間是指數增長的,這時候就可以通過動態規劃來解決這個問題。
動態規劃的本質其實就是兩點
自底向上分解子問題
通過變數儲存已經計算過的解
根據上面兩點,我們的斐波那契數列的動態規劃思路也就出來了
斐波那契數列從 0 和 1 開始,那麼這就是這個子問題的最底層
通過陣列來儲存每一位所對應的斐波那契數列的值
function
fib(n)
return array[n]
}console.
log(
fib(
100)
)//354224848179262000000
該問題可以描述為:給定一組物品,每種物品都有自己的重量和**,在限定的總重量內,我們如何選擇,才能使得物品的總**最高。每個問題只能放入至多一次。
直接來分析能放三種物品的情況,也就是最後一行
當容量少於 3 時,只取上一行對應的資料,因為當前容量不能容納物品 3
當容量 為 3 時,考慮兩種情況,分別為放入物品 3 和不放物品 3
2.1 不放物品 3 的情況下,總價值為 10
2.2 放入物品 3 的情況下,總價值為 12,所以應該放入物品 3
當容量 為 4 時,考慮兩種情況,分別為放入物品 3 和不放物品 3
3.1 不放物品 3 的情況下,總價值為 10
3.2 放入物品 3 的情況下,和放入物品 1 的價值相加,得出總價值為 15,所以應該放入物品 3
當容量 為 5 時,考慮兩種情況,分別為放入物品 3 和不放物品 3
4.1 不放物品 3 的情況下,總價值為 10
4.2 放入物品 3 的情況下,和放入物品 2 的價值相加,得出總價值為 19,所以應該放入物品 3
/**
* @param w 物品重量
* @param v 物品價值
* @param c 總容量
* @returns
*/function
knapsack
(w, v,c)
// 自底向上開始解決子問題,從物品 2 開始
for(
let i =
1; i < length; i++)}
}return array[length -1]
[c]}
最長遞增子串行意思是在一組數字中,找出最長一串遞增的數字,比如
0, 3, 4, 17, 2, 8, 6, 10
對於以上這串數字來說,最長遞增子串行就是 0, 3, 4, 8, 10,可以通過以下**更清晰的理解
function
lis(n)}}
let res =
1for
(let i =
0; i < array.length; i++
)return res
}
筆記 前端需要了解的jQuery選擇器
基本選擇器 id,class,element,層次選擇器 parent child,prev next prev siblings 基本過濾器選擇器 first,last not even odd eq gt lt 內容過濾器選擇器 contains empty has parent 可見性過濾器選...
筆記 前端需要了解的常見資料結構 棧
棧是乙個線性結構,在計算機中是乙個相當常見的資料結構。棧的特點是只能在某一端新增或刪除資料,遵循先進後出的原則。每種資料結構都可以用很多種方式來實現,其實可以把棧看成是陣列的乙個子集,所以這裡使用陣列來實現。class stack push item pop peek getcount isempt...
筆記 前端需要了解的常見資料結構 佇列
佇列是乙個線性結構,特點是在某一端新增資料,在另一端刪除資料,遵循先進先出的原則。這裡會講解兩種實現佇列的方式,分別是單鏈佇列和迴圈佇列。class queue enqueue item dequeue getheader getlength isempty 因為單鏈佇列在出隊操作的時候需要 o n...