筆記 前端需要了解的演算法題 動態規劃

2021-10-05 19:56:12 字數 1948 閱讀 1670

動態規劃背後的基本思想非常簡單。就是將乙個問題拆分為子問題,一般來說這些子問題都是非常相似的,那麼我們可以通過只解決一次每個子問題來達到減少計算量的目的。

一旦得出每個子問題的解,就儲存該結果以便下次使用。

斐波那契數列就是從 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...