深度優先搜索和廣度優先搜索
深度優先
DFS Depth First Search
遍歷方式
- 遞歸
- 非遞歸,使用循環遍歷,需要棧後進先出的特性來輔助
廣度優先
BFS Breadth First Search
遍歷方式
- 循環遍歷,需要隊列先進先出的特性來輔助
貪心算法 Greedy
貪心算法是一種在每一步選擇中都採取在當前狀態下最好或最優(即最有利)的選擇,從而希望導致結果是全局最好或最優的算法。
貪心算法與動態規劃的不同在於它對每個子問題的解決方案都做出選擇,不能回退。動態規劃則會保存以前的運算結果,並根據以前的結果對當前進行選擇,有回退功能。
貪心法可以解決一些最優化問題,如:求圖中的最小生成樹、求哈夫曼編碼等。然而對於工程和生活中的問題,貪心法一般不能得到我們所要求的答案。
一旦一個問題可以通過貪心法來解決,那麼貪心法一般是解決這個問題的最好辦法。由於貪心法的高效性以及其所求得的答案比較接近最優結果,貪心算法也可以用作輔助算法或者直接解決一些要求結果不特別精確的問題。
貪心算法的應用場景
簡單地説,問題能夠分解成子問題來解決,子問題的最優解能遞推到最終問題的最優解。這種子問題最優解稱為最優子結構。
二分查找
二分查找針對的是一個有序的數據集合,查找思想有點類似分治思想。每次都通過跟區間的中間元素對比,將待查找的區間縮小為之前的一半,直到找到要查找的元素,或者區間被縮小為 0。
二分查找的前提
- 目標函數單調性(單調遞增或者遞減)
- 存在上下界(bounded),溢出問題
- 能夠通過索引訪問(index accessible)
二分查找應用場景的侷限性
- 二分查找依賴的是順序表結構,簡單點説就是數組
- 二分查找針對的是有序數據
- 數據量太小不適合二分查找
- 數據量太大也不適合二分查找
二分查找的應用場景
- 查找第一個值等於給定值的元素
- 查找最後一個值等於給定值的元素
- 查找第一個大於等於給定值的元素
- 查找最後一個小於等於給定值的元素