1. 程式人生 > >5.1 python資料結構與演算法之演算法思想概述

5.1 python資料結構與演算法之演算法思想概述

常見的演算法思想概述:

這一章開始介紹演算法知識, 為後面的學習奠定基礎,除了下一節要介紹的遞迴外,後面還將詳細介紹 動態規劃, 貪心等思想, 更重要的是,後續查詢,排序等常見演算法中,均要涉及到這些基礎的演算法思想。

演算法的英文名稱是Algorithm,這個詞在1957年之前在Webster’s New World Dictionary(《韋氏新世界詞典》)中還未出現,只能找到帶有它的古代涵義的較老形式的“Algorism”(算術),是指用阿拉伯數字進行算術運算的過程。在中世紀時,珠算家用算盤進行計算,而算術家用算術進行計算。 

根據經驗和發展結論得出,演算法應該具有如下五個重要的特徵。 

(1)有窮性:保證執行有限步驟之後結束;

(2)確切性:每一步驟都有確切的定義;

(3)輸入:每個演算法有零個或多個輸入,以刻畫運算物件的初始情況,所謂零個輸入是指演算法本身定除了初始條件;

(4)輸出:每個演算法有一個或多個輸出,顯示對輸入資料加工後的結果。沒有輸出的演算法是毫無意義的;

(5)可行性:在原則上演算法能夠精確地執行,進行有限次運算後即可完成一種運算。

基礎演算法思想:

(1)窮舉

窮盡每一種可能的情況,效率不高,適用於沒有明顯規律的情況,同時又最為耗時的一種解決實際問題的演算法思想。在可能的解空間範圍不大的情況下,也算是快刀斬亂麻了,不用找規律動腦筋。

(2) 遞推

根據已有的資料和關係,逐步推導而得到結果。

(3)遞迴

一種直接或間接地呼叫原演算法本身的一種演算法,見下一節5.2

(4)分治

分治法,字面上的解釋是“分而治之”,就是把一個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。這個技巧是很多高效演算法的基礎,如排序演算法(快速排序,歸併排序),傅立葉變換(快速傅立葉變換)……

設計思想:將一個難以直接解決的大問題,分割成一些規模較小的相同問題,相互獨立,以便各個擊破,分而治之。這自然導致遞迴過程的產生。分治與遞迴像一對孿生兄弟,經常同時應用在演算法設計之中,並由此產生許多高效演算法。

執行步驟:

         1)、確定一個規模為n的難解決問題難以直接解決

         2)、將該問題分解為m個規模較小的子問題a,a們之間相互獨立,與原問題形式相同

         3)、遞迴地解決這些小問題,即一個一個解決

         4)、然後,將各子問題的解合併到原問題的解

(5)動態規劃

基本思想與分治法類似,也是將待求解的問題分解為若干個子問題(階段),按順序求解子階段,前一子問題的解,為後一子問題的求解提供了有用的資訊。在求解任一子問題時,列出各種可能的區域性解,通過決策保留那些有可能達到最優的區域性解,丟棄其他區域性解。依次解決各子問題,最後一個子問題就是初始問題的解。

由於動態規劃解決的問題多數有重疊子問題這個特點,為減少重複計算,對每一個子問題只解一次,將其不同階段的不同狀態儲存在一個二維陣列中。

與分治法最大的差別是:適合於用動態規劃法求解的問題,經分解後得到的子問題往往不是互相獨立的(即下一個子階段的求解是建立在上一個子階段的解的基礎上,進行進一步的求解)。

(6)貪心

求區域性最優,對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的區域性最優解。

貪心演算法沒有固定的演算法框架,演算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心演算法不是對所有問題都能得到整體最優解,選擇的貪心策略必須具備無後效性,即某個狀態以後的過程不會影響以前的狀態,只與當前狀態有關。

(7)回溯

類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就“回溯”返回,嘗試別的路徑,類似於走迷宮的過程。

回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為“回溯點”。

基本思想: 在包含問題的所有解的解空間樹中,按照深度優先搜尋的策略,從根結點出發深度探索解空間樹。當探索到某一結點時,要先判斷該結點是否包含問題的解,如果包含,就從該結點出發繼續探索下去,如果該結點不包含問題的解,則逐層向其祖先結點回溯。(其實回溯法就是對隱式圖的深度優先搜尋演算法)。

(8)概率演算法

無法計算解析,將實際問題的求解數值通過近似值的方式解出。

執行步驟:

         1)、將問題轉化為相應的幾何圖形S,S面積容易求出,問題的結果對應幾何圖形中某一部分S1的問題

         2)、然後,向幾何圖形裡撒點

         3)、統計幾何圖形S和S1中的點數,根據面積關係及點數關係來計算得到結果

         4)、判斷上述結果是否在需要精度內。
 

參考:常見的演算法思想(整理)