演算法 演算法設計技巧

2021-05-21 22:36:24 字數 2132 閱讀 3972

一、演算法設計

1、很多時候,對於資料結構中用到的演算法都是一些具體的實現,一些具體的例項,這裡討論的是演算法設計的一般性方法。

二、貪婪演算法

1、在每乙個節點,選擇區域性最優的結果。以區域性最優表示全域性最優解。在通常情況下,這都是適用的,如果區域性最優代替不了全域性最優,

得到的就是乙個次最優解。

2、如果不要求絕對最佳答案,那麼有時候用簡單的貪婪演算法生成近似答案,而不是使用一半說來產生準確答案所需要的複雜演算法。

3、貪婪演算法的幾個應用,包括簡單的排程問題,檔案壓縮,最短路徑等。

4、實際上,所有的排程問題或者是np完全的,或者是貪婪演算法可解的。

5、huffman演算法,可以應用到檔案壓縮中,採用依次合併最小的權樹來生成。

6、近似裝箱問題:

將n個物品裝到m個箱子裡。

a、存在使得任意聯機裝箱演算法至少使用4/3最優箱子數的輸入。

b、聯機最佳適合演算法在完全隨機的情緒下,得到的箱子比最優裝箱方法多約2%,在許多情況下,這是完全可以接受的。

c、使用離線演算法,可以觀察全部物品後再算出答案,可以先排序,通過改進的首次適合非增演算法可以 使得箱子數不超過最優的4/3倍。

7、貪婪演算法在有最優子結構的問題中尤為有效。最優子結構的意思是區域性最優解能決定全域性最優解。

簡單地說,問題能夠分解成子問題來解決,子問題的最優解能遞推到最終問題的最優解。

三、分治演算法

1、分治演算法由兩部分組成:

分:遞迴解決較小的問題

治:然後,從子問題的解構建原問題的解。

2、傳統上,在正文中至少含有兩個遞迴呼叫的例程叫做分治演算法。典型實例如:歸併排序、快速排序等。

3、對於方程:t(n)=2*t(n/2) + o(n),方程的解為o(nlogn)。

4、一些其他例項:

a、最近點問題:對於平面上的n各點,找出最近的兩個點。

可以通過計算所有的點距離,然後都比較之,如此將花費o(n*n)。

可以通過分治,對x進行排序,然後以乙個分界線將平面分成兩部分,然後分別計算,所得時間複雜度可以為o(n*logn)。

四、動態規劃演算法

1、動態規劃是一種在數學和電腦科學中使用的,用於求解包含重疊子問題的最優化問題的方法。

其基本思想是,將原問題分解為相似的子問題,在求解的過程中通過子問題的解求出原問題的解。

2、性質

a、最優子結構性質。如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質

(即滿足最優化原理)。最優子結構性質為動態規劃演算法解決問題提供了重要線索。

b、子問題重疊性質。子問題重疊性質是指在用遞迴演算法自頂向下對問題進行求解時,每次產生的子問題並不總是新問題,

有些子問題會被重複計算多次。動態規劃演算法正是利用了這種子問題的重疊性質,對每乙個子問題只計算一次,然後

將其計算結果儲存在乙個**中,當再次需要計算已經計算過的子問題時,只是在**中簡單地檢視一下結果,從而

獲得較高的效率。

3、貪婪演算法與動態規劃的不同在於它每對每個子問題的解決方案都做出選擇,不能回退。動態規劃則會儲存以前的運算結果,並根據以前的結果對當前進行選擇,有回退功能。

4、例項:

斐波那契數列

揹包問題

五、隨機化演算法

1、產生隨機數的最簡單的方法:線性同餘數發生器。

xi+1 = axi mod m

建議取值:m=2^31 - 1 = 2147483647, a=48271

2、應用:

跳躍表素性測試

六、回溯演算法

1、在許多情況下,回溯演算法相當於窮舉搜尋的巧妙實現,但效能一般不理想。不過,情況並不總是如此,即使如此,在某些情形下它

相比蠻力窮舉搜尋,工作量也有顯著的節省。

2、當然,效能是相對的:對於排序而言,o(n^2)的演算法是相當差的,但對旅行售貨員(或任何np完全)問題,o(n^5)演算法則是

里程碑式結果。

3、一些例項:

收費公路重建問題

博弈七、總結

1、熟悉了資料結構之後,要從理論上再理解演算法設計,從具體抽象出一般的設計方法。

2、很多演算法都和數學結合的比較緊密,需要使用數學方法來證明其可行性與不可行性,使用數學方法來分析時間複雜度和空間複雜度,

使用很多數學方面的成果。

3、所以說,數學是科學的根本,當然也包括了電腦科學。

演算法設計技巧

資料結構與演算法分析 第十章整理 greedy algorithmoptimal suboptimal solution 貪婪演算法分階段地工作,在每個階段,可以認為所做決定是好的,而不考慮將來的後果。一般來說,這意味著選擇的是某個區域性的最優。這種 眼下能拿到的就拿 的策略即是貪婪演算法。近似裝箱...

JS演算法 演算法的設計和技巧(尚未完善)

分成三部分 分解原問題為多個子問題 解決子問題,用返回解決子問題的方式的遞迴演算法 組合這些子問題的解決方法,得到原問題的解 歸併和排序演算法都是分而治之的演算法 同樣的二分搜尋也可以採用該方法實現,詳細的步驟為 分解 計算mid並搜尋陣列較小或者較大的一半 解決 在較小或者較大的一半中搜尋值 合併...

演算法技巧總結

1.排序對演算法效能的影響 大家都知道排序演算法,這個應該不是很難了吧,技巧在於很多時候可以利用排序演算法來提供效能,比如 例 給定乙個陣列a n 求陣列中是否存在兩個數的和等於給定值sum並輸出?這個問題很常見,解決方法有很多種,這裡我就不贅述。這裡採用雙指標遍曆法的。陣列不一定有序,我們這裡先不...