分成三部分:
分解原問題為多個子問題
解決子問題,用返回解決子問題的方式的遞迴演算法
組合這些子問題的解決方法,得到原問題的解
歸併和排序演算法都是分而治之的演算法
同樣的二分搜尋也可以採用該方法實現,詳細的步驟為:
分解:計算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判斷是否...