算法分析與設計期末總結

這是我的算法分析與設計課程自己總結的一些知識點,應該不太全,記錄一下


算法的特徵:

輸入,輸出,確定性,有窮性,可行性

基本數據結構:

線性,樹結構,圖結構,集合

 

遞歸與分治

1、遞歸法

使用遞歸方法時須注意的問題:

(1)   遞歸調用函數必須在滿足某個條件時能夠退出該程序

(2)   遞歸調用由於使用堆棧,因此佔用的存儲空間會很大,且所花費的時間也很多,因而效率低下。

2、分治法

    將一個規模比較大的問題分解成若干個規模較小的問題,然後將這些子問題的解合併解出整個問題的解。

 

分而治之算法(分解,解決,合併)

算法思想

    爲了解決一個大的問題,可以:1) 把它分成兩個或多個更小的問題; 2) 分別解決每個小問題; 3) 把各小問題的解答組合起來,即可得到原問題的解答。小問題通常與原問題相似,可以遞歸地使用分而治之策略來解決。

分而治之方法很自然地導致了遞歸算法的使用。在許多例子裏,這些遞歸算法在遞歸程序中得到了很好的運用。實際上,在許多情況下,所有爲了得到一個非遞歸程序的企圖都會導致採用一個模擬遞歸棧。不過在有些情況下,不使用這樣的遞歸棧而採用一個非遞歸程序來完成分而治之算法也是可能的,並且在這種方式下,程序得到結果的速度會比遞歸方式更快。解決金塊問題的分而治之算法(和歸併排序方法就可以不利用遞歸而通過一個非遞歸程序來更快地完成

可以運用分而治之方法來解決排序問題,該問題是將n 個元素排成非遞減順序。分而治之方法通常用以下的步驟來進行排序算法:n 1,算法終止;否則,將這一元素集合分割成兩個或更多個子集合,對每一個子集合分別排序,然後將排好序的子集合歸併爲一個集合。

選擇排序算法時間複雜度On平方)

歸併排序程序將花費(nlogn) 的時間。

快速排序時間複雜度:

Tn=Tn-1+O(n); [T(n)=C1n+T(n-1);T(1)=C2]

最好情況:

Tn=2T(n/2)+O(n); [T(n)=C1n+2T(n/2);T(1)=C2](C1,C2爲常數)

 

動態規劃算法

動態規劃算法的特點:

      動態歸化算法是將問題分解成若干個子問題,通過求解這些子問題的最優解來求整個問題的最優解。與分治法不同的是,這些子問題往往並不相互獨立,不能將子問題的解作爲最後問題的解。動態規劃往往用於求解問題的最優解

1:給定n個矩陣的連乘表達式,求其最少需要多少次乘法運算才能計算出乘法運算的結果

動態規劃問題取決於兩個重要的性質:

      1、最優子結構性質:問題的最優解包含了其子問題的最優解。

      2、子問題重疊性質:後續問題的求解可通過前面的子問題的求解結果計算出來。

      因此可通過動態規劃基本上可通過遞歸算法實現。

 

2:設序列X={x1,x2,x3…,xm}, Y={y1,y2,y3,…,yn},求這兩個序列的最長公共子序列Z

      Z={z1,z2,z3,…zk},則必有下面的結論存在:

  (1)如果xm=yn,說明xmyn一定是最長公共子序列中的最後一個元素,即zk=xm=yn。同樣可以得出{z1,z2,z3,…, zk-1}是序列Xm-1Yn-1的最長公共子序列。

   (2)如果xmynzkxm,說明xm不是Z中的一個元素,Z中的元素與X中的最後一個元素無關,因此ZXm-1Yn的最長公共子序列。

   (3)如果xmynzkyn,說明yn不是Z中的一個元素,Z中的元素與Y中的最後一個元素無關,因此ZXmYn-1的最長公共子序列。

 

 

貪心算法

貪心算法的基本要素:貪心選擇最優子結構

 

回溯法(系統性,跳躍性)

回溯法實際上是一種搜索問題的解的一種方法。所採用的方法一般爲深度優先搜索法,所搜索的路徑一般是沿樹形結構進行搜索。在搜索過程中,首先會判斷所搜索的樹結點是否包含問題的解,如果肯定不包含,則不再搜索以該結點爲根的樹結點,而向其祖先結點回溯。否則進入該子樹,繼續按深度優先策略搜索。

在訪問某一個結點時,是否訪問其某一顆子樹的判斷標準是:

1)該結點是否與其它結點之間有連接關係。

2)如果有,是否該結點所用的顏色是否已經使用過。

3)如果上述兩個條件同時成立,則返回false.

 (4) 如果上述條件均不成立,說明可以找到一種顏色使其與其它與該結點相連的結點的顏色不同,這樣就可以繼續訪問下一層的結點。

5)如果當前訪問的結點所在的層數已經大於結點的個數,顯然已經爲每個節點分配了相應的顏色,可以輸出這些顏色。

6)同樣在訪問結點的下一棵子樹時,其訪問的方法與前面相同。此時,需要將前面訪問的子樹的所設置的顏色設置成0,以便訪問下一個子樹時給它安排新的顏色   

 

尋找問題的解的一種可靠的方法是首先列出所有候選解,然後依次檢查每一個,在檢查完所有或部分候選解後,即可找到所需要的解。理論上,當候選解數量有限並且通過檢查所有或部分候選解能夠得到所需解時,上述方法是可行的。不過,在實際應用中,很少使用這種方法,因爲候選解的數量通常都非常大(比如指數級,甚至是大數階乘),即便採用最快的計算機也只能解決規模很小的問題。對候選解進行系統檢查的方法有多種,其中回溯和分枝定界法是比較常用的兩種方法。按照這兩種方法對候選解進行系統檢查通常會使問題的求解時間大大減少(無論對於最壞情形還是對於一般情形)。事實上,這些方法可以使我們避免對很大的候選解集合進行檢查,同時能夠保證算法運行結束時可以找到所需要的解。因此,這些方法通常能夠用來求解規模很大的問題。

 

算法思想

回溯(ba c k t r a c k i n g)是一種系統地搜索問題解答的方法。爲了實現回溯,首先需要爲問題定義一個解空間 solution space),這個空間必須至少包含問題的一個解(可能是最優的)。下一步是組織解空間以便它能被容易地搜索。典型的組織方法是圖或樹。一旦定義瞭解空間的組織方法,這個空間即可按深度優先的方法從開始節點進行搜索。       

回溯方法的步驟如下:

    (1)定義一個解空間,它包含問題的解。

    (2)用適於搜索的方式組織該空間。

    (3)用深度優先法搜索該空間,利用限界函數避免移動到不可能產生解的子空間。

回溯算法的一個有趣的特性是在搜索執行的同時產生解空間。在搜索期間的任何時刻,僅保留從開始節點到當前E-節點的路徑。因此,回溯算法的空間需求爲O(從開始節點起最長路徑的長度)

 

分支限界法

以廣度優先或最小耗費方式搜索問題解的算法叫分支限界法

 

算法分析:

         採用分支限界法求解問題的關鍵是先要建立一個約束條件,也就是剪枝的判斷條件。顯然從起點到達圖中同一頂點的路徑之和越短,其結果也就越符合求解要求,反之越長的結點所對應的子樹也就應該從求解空間中剪去。

         求解時應該建立一個小頂堆空間,用於存儲活結點表,並在求解過程中不斷的構建堆,直到處理完所有的結點。該堆中的結點表示從起點到該點的當前最短路徑的結點編號,並保存其路徑長度。

與回溯法不同的是,分支限界法的求解目標往往是找出滿足約束條件的一個解,或者在滿足約束條件的解中找出是某一目標函數值達到極大或者極小的解,而不是問題的所有解。

      分支限界法的求解方式往往採用廣度優先或者以最小耗費優先的方式搜索解空間樹。

 

 

快速排序算法的性能取決於劃分的對稱性。

 

分支限界法分爲兩種:

隊列式優先隊列式

隊列式擴展結點的原則:

FIFO

節點的優先級(查找一個具有最小耗費或最大收益的解);

回溯法和分支限界法是在蠻力法的基礎上的一個改進。蠻力法是搜索所有的可能解,然後再評估這些解哪一個滿足約束條件。而回溯法及分支限界法則每次只構造可能解的一部分,然後評估這個部分解。如果這個部分解有可能導致一個可行解,則對其進一步構造,否則就不必繼續構造這個部分解,從而避免搜索所有的可能解。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章