1. 程式人生 > >各種基礎演算法及例項

各種基礎演算法及例項

一、貪心演算法
​​ 只根據當前情況做出最好的選擇,其最終結果可能不是最優解,也可以得到最優解的近似解。
貪心演算法遵循的兩個原則:
1、一旦做出選擇,不可以後悔。
2、最終結果可能不是最優解

二、分治法
​​ 將一個大問題分解成一個個小的問題,從上到下一層層解決,最後再進行合併,得到的結果就是最終我們想要的結果,​​快速排序是運用分治法的典型,當資料量達到10^6後,使用快速排序只需要39毫秒,而使用氣泡排序則需要549432毫秒,超過9個小時!

三、動態規劃
​​ 動態規劃和分治法類似,最大的區別是分治法是自上而下的,而動態規劃法是自下而上的,舉個例子,皇帝統治一箇中央帝國,皇帝只有一個人如何統治一個偌大的帝國?皇帝先把整個國家分成一個個郡,郡分為縣,縣分為鎮,鎮分為鄉,鄉分為村,村分為戶,這樣從鄉長往上逐級彙報,最終彙總到皇帝這裡,皇帝就掌握了全國的基本資訊。​​

四、回溯法
回溯法本質上是一種深度優先演算法,如同一個人走迷宮,每到一個路口做一個標記,選擇一條路走下去,發現走不通後再返回到這個路口,再選擇另一條路走下去,知道走出迷宮為止。
​​

五、分支限界法
1 演算法原理:
分支限界法(branch and bound method)按廣度優先策略搜尋問題的解空間樹,在搜尋過程中,對待處理的節點根據限界函式估算目標函式的可能取值,從中選取使目標函式取得極值(極大或極小)的結點優先進行廣度優先搜尋,從而不斷調整搜尋方向,儘快找到問題的解。分支限界法適合求解最優化問題。
1.1 分支限界法與回溯法:

  1. 求解目標:回溯法的求解目標是找出解空間樹中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的一個解,或是在滿足約束條件的解中找出在某種意義下的最優解。
  2. 搜尋方式的不同:回溯法以深度優先的方式搜尋解空間樹,而分支限界法則以廣度優先或以最小耗費優先的方式搜尋解空間樹。
    2.1分支限界法思想:
    分支限界法首先要確定一個合理的限界函式(bound funciton),並根據限界函式確定目標函式的界[down ,up],按照廣度優先策略搜尋問題的解空間樹,在分直結點上依次擴充套件該結點的孩子結點,分別估算孩子結點的目標函式可能值,如果某孩子結點的目標函式可能超出目標函式的界,則將其丟棄;否則將其加入待處理結點表(簡稱PT表),依次從表PT中選取使目標函式取得極值的結點成為當前擴充套件結點,重複上述過程,直到得到最優解。
    2.2 常見的兩種分支限界法:
  3. 佇列式(FIFO)分支限界法 按照佇列先進先出(FIFO)原則選取下一個結點為擴充套件結點。
  4. 優先佇列式分支限界法 按照優先佇列中規定的優先順序選取優先順序最高的結點成為當前擴充套件結點。

程式碼地址:https://github.com/FishLiuWei/Fish-Store/tree/master/CalculateDemo