1. 程式人生 > >小仙女講軟考之演算法設計和分析

小仙女講軟考之演算法設計和分析

小仙女課堂開課啦,演算法設計總學不好?多半是沒理解透基本概念,看小仙女牌部落格就好啦。


分治法——分而治之,各個突破

現實匯入:


想想秦始皇是怎麼統一六國的?“遠交近攻,各個擊破”。

對嘍,先集中兵力打一個國家,成功後再攻擊另一個。這便體現了分治的思想。

先打近的,再打遠的,如果先打遠的再打近的,會激起各國聯合抗秦的鬥志。所以,如果攻不下近的國家,遠的國家也打不成,這體現了遞迴思想。

why

原問題太大,太複雜,分開來看會容易些。

how

分——治——合

what

.歸併排序:

先在各小組內排,再擴大小組


.最大子段和問題:

8745319序列中找出含有3個元素的最大子段和?最大子段為

874,其和為19

在一個給出序列中找出含有N個數字的連續欄位,條件是其和最大。


.漢諾塔問題:

假設共有10個盤子,先借助C,把前9個盤子放到B上;然後再將第10個盤子放到C上;最後藉助A,將B上的9個盤子放到C上。


動態規劃法——拿最利於自己的東西

現實引入:


小偷去超市偷東西,假如已經將揹包裝滿,準備離開時看到門口有塊黃金可以偷,那他偷還是不偷?

有人說不偷,那如果他的揹包裡放著些吃的,把吃的拿出來,把黃金放進去,豈不是更好?

有人說偷,那如果他的揹包裡是價值更大的鑽石呢?如果換了豈不是愚蠢。

在偷與不偷的思考過程中,就進行了一次動態規劃的演算。

why

最優子結構;重疊子問題

how

定義什麼是最優解——先假定已持有最優解——考慮是否採用面前東西

what

.0-1揹包問題:

放還是不放,is a question


.最長公共子序列(LCS):

1234545679,求其LCS45

貪心法——先吃了最優的

現實引入:


餓漢子問題。當你特別餓的時候,是見著啥吃啥還是等著挑個最美味的?

why

最優子結構;貪心選擇性質

how

僅根據當前已有的資訊作出選擇,且一旦作出選擇就不再改變。就像你吃下去了就沒辦法再吐出來了。

what

.活動選擇問題(這個問題本仙女不懂,待我回天上後再仔細思考一下)

.揹包問題可以按“最小重量先放”、“最大價值先放”等原則,將東西放入揹包

回溯法——深度優先查詢

現實引入:


讓你去一塊玉米地,只可前進或後退,最終要找到其中最大個的玉米,你怎麼做?

往前走的過程中,發現還是剛才碰到的那個大,再往後退去找它。這個往後退的過程就是“回溯”

why

及時“剪枝”,能避免大量無謂的搜尋。

how

定義解空間——確定易於搜尋的解空間結構——以深度優先的方式搜尋解空間

what

.0-1揹包問題

.n皇后問題


小結:

本仙女這次下凡只是說說這些演算法的基本概念,至於對各方法的比較和其在程式碼中是怎麼具體實現的,請聽以後的以後分解。

一家之言,姑妄論之。如果讀者有什麼想法可以交流,就再好不過啦~