JS演算法 演算法的設計和技巧(尚未完善)

2021-10-09 09:02:14 字數 2148 閱讀 7109

分成三部分:

分解原問題為多個子問題

解決子問題,用返回解決子問題的方式的遞迴演算法

組合這些子問題的解決方法,得到原問題的解

歸併和排序演算法都是分而治之的演算法

同樣的二分搜尋也可以採用該方法實現,詳細的步驟為:

分解:計算mid並搜尋陣列較小或者較大的一半

解決:在較小或者較大的一半中搜尋值

合併:這裡是直接返回值

function binarysearchrecursive(array,value,low,high)else

}return -1

}export function binarysearch(array,value)

動態規劃

將複雜問題分解成更小的子問題開解決

使用動態規劃需要注意三個步驟:

定義子問題

實現要反覆執行來解決子問題的部分(類似遞迴

識別並求解出基線條件

用動態規劃解決的一些著名問題:

揹包問題:給出一組項,各自有值和容量,目標是找出總值最大的項的集合。限制在於總容量必須小於等於「揹包」的容量

他描述為:給乙個固定大小,能夠攜重量w的揹包,以及一組有價值和重量的物品,找到乙個最佳解決方案,使得裝入揹包的物品總重量不超過w並且總價值 最大

//揹包演算法

function knapsack(capacity,weights,values,n)

for(let i = 0;i<=n;i++)else if(weights[i-1]<=w)else}}

findvalues(n,capacity,ks,weights,values)

return ks[n][capacity]

}

最長公共子串行:找出一組序列的最長公共子串行(可由另一串行刪除元素但不改變餘下元素的順序而得到的)

找出兩個字串序列的最長子序列的長度。最長子序列是指,在兩個字串序列中以相同順序出現,但不要求連續的字串序列

//最長公共子串行演算法

function lcs(wordx,wordy)

}for(let i = 0;i<=m;i++)else if(wordx[i-1) === wordy[j-1]else}}

return l[m][n]

}

矩陣鏈相乘:給出一系列矩陣,目標是找到這些矩陣相乘的最高效辦法(計算次數盡可能少)。相乘運算不會進行,解決方案是找到這些矩陣各自相乘的順序

這個問題是要找出矩陣相乘的最佳方式,m行n列的矩陣a和m行p列的矩陣b,結果是n行p列的矩陣c

考慮到a* b * c * d的乘法,因此假設有以下幾種情況:

a是乙個10行100列的矩陣

b是乙個100行5列的矩陣

c是有乙個5行50列的矩陣

d是乙個50行1列的矩陣

a* b * c * d 的結果是乙個10行1列的矩陣

由於相乘的順序不一樣,結果也不一樣,所以需要構建乙個演算法,求出最少的乘法運算次數

function matrixchainorder(p)

for(let l= 2;l

硬幣找零:給出面額為d1—dn的一定數量的硬幣和要找零的錢數,找出有多少種方法

最少硬幣找零,是其中一種變種,找出最少需要的硬幣個數

//例如美國有以下面額的硬幣:

//d1 = 1,d2 = 5,d3 = 10,d4 = 25

//如果要找36美分的零錢,可以用乙個25+乙個10+乙個1

//需要找到n所需要的最小硬幣數,首先需要找到每個x

//if(cache[value])

let min =

let newmin

let newamout

//對每個面額都計算newamount的值,他的值會一直減少,直到找到零的最小錢數,若newamount是合理的值,則會計算他的找零結果

for(let i = 0;i=0)

if(newamount >=0 &&(newmin.length

圖的全源最短路徑:對所有頂點對(u,v),找出從頂點u到頂點v的最短路徑

演算法 演算法設計技巧

一 演算法設計 1 很多時候,對於資料結構中用到的演算法都是一些具體的實現,一些具體的例項,這裡討論的是演算法設計的一般性方法。二 貪婪演算法 1 在每乙個節點,選擇區域性最優的結果。以區域性最優表示全域性最優解。在通常情況下,這都是適用的,如果區域性最優代替不了全域性最優,得到的就是乙個次最優解。...

演算法設計技巧

資料結構與演算法分析 第十章整理 greedy algorithmoptimal suboptimal solution 貪婪演算法分階段地工作,在每個階段,可以認為所做決定是好的,而不考慮將來的後果。一般來說,這意味著選擇的是某個區域性的最優。這種 眼下能拿到的就拿 的策略即是貪婪演算法。近似裝箱...

JS 資料處理技巧及小演算法

根據屬性來更新乙個陣列中的物件 首先陣列是利用陣列map方法去遍歷arr的每乙個值,然後進行於newvalue的id進行對比,不同返回原來的項,相同返回newvalue.const updated arr.map function item 陣列去重 遍歷陣列,建立新陣列,利用indexof判斷是否...