程式設計師必須知道的10大基礎實用演算法

2022-02-03 01:18:26 字數 2259 閱讀 7887

詳細介紹:廣度優先搜尋

戴克斯特拉演算法(dijkstra』s algorithm)是由荷蘭計算機科學家艾茲赫爾·戴克斯特拉提出。迪科斯徹演算法使用了廣度優先搜尋解決非負權有向圖的單源最短路徑問題,演算法最終得到乙個最短路徑樹。該演算法常用於路由演算法或者作為其他圖演算法的乙個子模組。

該演算法的輸入包含了乙個有權重的有向圖 g,以及g中的乙個**頂點 s。我們以 v 表示 g 中所有頂點的集合。每乙個圖中的邊,都是兩個頂點所形成的有序元素對。(u, v) 表示從頂點 u 到 v 有路徑相連。我們以 e 表示g中所有邊的集合,而邊的權重則由權重函式 w: e → [0, ∞] 定義。因此,w(u, v) 就是從頂點 u 到頂點 v 的非負權重(weight)。邊的權重可以想像成兩個頂點之間的距離。任兩點間路徑的權重,就是該路徑上所有邊的權重總和。已知有 v 中有頂點 s 及 t,dijkstra 演算法可以找到 s 到 t的最低權重路徑(例如,最短路徑)。這個演算法也可以在乙個圖中,找到從乙個頂點 s 到任何其他頂點的最短路徑。對於不含負權的有向圖,dijkstra演算法是目前已知的最快的單源最短路徑演算法。

演算法步驟:

1. 初始時令 s=,t=,t中頂點對應的距離值

若存在,d(v0,vi)為弧上的權值

若不存在,d(v0,vi)為∞

2. 從t中選取乙個其距離值為最小的頂點w且不在s中,加入s

3. 對其餘t中頂點的距離值進行修改:若加進w作中間頂點,從v0到vi的距離值縮短,則修改此距離值

重複上述步驟2、3,直到s中包含所有頂點,即w=vi為止

詳細:dijkstra演算法

動態規劃(dynamic programming)是一種在數學、電腦科學和經濟學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。 動態規劃常常適用於有重疊子問題和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解法。

動 態規劃背後的基本思想非常簡單。大致上,若要解乙個給定問題,我們需要解其不同部分(即子問題),再合併子問題的解以得出原問題的解。 通常許多 子問題非常相似,為此動態規劃法試圖僅僅解決每個子問題一次,從而減少計算量: 一旦某個給定子問題的解已經算出,則將其記憶化儲存,以便下次需要同乙個 子問題解之時直接查表。 這種做法在重複子問題的數目關於輸入的規模呈指數增長時特別有用。

關於動態規劃最經典的問題當屬揹包問題。

演算法步驟:

1. 最優子結構性質。如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質(即滿足最優化原理)。最優子結構性質為動態規劃演算法解決問題提供了重要線索。

2. 子問題重疊性質。子問題重疊性質是指在用遞迴演算法自頂向下對問題進行求解時,每次產生的子問題並不總是新問題,有些子問題會被重複計算多次。 動態規劃演算法正是利用了這種子問題的重疊性質,對每乙個子問題只計算一次,然後將其計算結果儲存在乙個**中,當再次需要計算已經計算過的子問題時,只是 在**中簡單地檢視一下結果,從而獲得較高的效率。

詳細參考:

從全球導航到輸入法:談談動態規劃

動態規劃

樸 素貝葉斯分類演算法是一種基於貝葉斯定理的簡單概率分類演算法。貝葉斯分類的基礎是概率推理,就是在各種條件的存在不確定,僅知其出現概率的情況下, 如何完成推理和決策任務。概率推理是與確定性推理相對應的。而樸素貝葉斯分類器是基於獨立假設的,即假設樣本每個特徵與其他特徵都不相關。

樸素貝葉斯分類器依靠精確的自然概率模型,在有監督學習的樣本集中能獲取得非常好的分類效果。在許多實際應用中,樸素貝葉斯模型引數估計使用最大似然估計方法,換言之樸素貝葉斯模型能工作並沒有用到貝葉斯概率或者任何貝葉斯模型。

儘管是帶著這些樸素思想和過於簡單化的假設,但樸素貝葉斯分類器在很多複雜的現實情形中仍能夠取得相當好的效果。

程式設計師必須知道的10大基礎實用演算法及其講解(1)

演算法一 快速排序演算法 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的架...

程式設計師必須知道的10大基礎實用演算法及其講解

程式設計師必須知道的10大基礎實用演算法及其講解 1 快速排序 介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部...

程式設計師必須知道的7大基礎實用演算法及其講解

1 快速排序 介紹 快速排序是由東尼 霍爾所發展的一種排序演算法。在平均狀況下,排序 n 個專案要 n log n 次比較。在最壞狀況下則需要 n2 次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 n log n 演算法更快,因為它的內部迴圈 inner loop 可以在大部分的架構上很...