摘自 鄒恒明《演算法之道》
採取分治策略解決問題有三個步驟:
(1) 將問題分解為若干個小的子問題。每個子問題和大問題同型,但規模更小。
(2) 遞迴解決這些問題。
(3) 將子問題的解答合併,並獲得大問題的解答。
第二步中「遞迴解決這些子問題」指的是按照同樣的分治策略進行求解,即通過將這些子問題分解到更小的孫子問題來進行求解。就這樣一直分解下去,直到分解出來的子問題簡單到只用常數操作時間就可解決為止。而遞迴是彰顯遞迴優勢的放大器。如果沒有遞迴,那麼分治策略的效果不是沒有就是微不足道。就像我們分治乘法運算,如果只分解一次,效率改善不足掛齒。
在分解到子問題規模達到微不足道的境界,子問題的就可以用常數時間來求得。然後我們反照遞迴順序由低至上將子問題的解合併起來,逐級上推就構成原問題的解。
在分而治之的策略下,真正的工作也由上述三個步驟組成,即所有的工作分散至這三個地方:分解部分、遞迴部分和合併部分。而整個分而治之策略的時間複雜性也由這三項的時間複雜性之和構成。由於不斷遞迴後,最後子問題將變得極為簡單,能夠輕而易舉地解決,其解決的時間複雜性在整個策略中的比重微乎其微,可以忽略不計。因此,分而治之策略的真正成本實際上是由分解和合併兩個部分構成,即到底有分解多少次,每次分解的子問題數到底是多少?到底要合併多少次,每次分解與合併需要多少時間?其中最為關鍵的是分解出來的子問題數、每個子問題的大小,以及分解和合併本身的時間成本。這些是決定分而治之策略是否奏效的決定因素。因此優良的分解合併策略就十分重要。
遞迴演算法與分治策略
關於遞迴的學習 1 遞迴演算法的基本思想是 把規模大的 較難解決的問題變成規模較小的的問題。規模較小的問題又變成規模更小的問題,並且小到一定程度可以直接得出它的解,從而得到原來問題的解。遞迴是一種直接或間接呼叫自身的函式的一種演算法,很常用,一般用於解決三類問題 資料的定義按遞迴定義的。fibona...
分治演算法 1 金塊問題 遞迴和分治策略
例14 2 金塊問題 有乙個老闆有一袋金塊。每個月將有兩名雇員會因其優異的表現分別被獎勵乙個金塊。按規矩,排名第一的雇員將得到袋中最重的金塊,排名第二的雇員將得到袋中最輕的金塊。根據這種方式,除非有新的金塊加入袋中,否則第一名雇員所得到的金塊總是比第二名雇員所得到的金塊重。如果有新的金塊週期性的加入...
python演算法之分治演算法
當我們求解某些問題時,由於這些問題要處理的資料相當多,或求解過程相當複雜,使得直接求解法在時間上相當長,或者根本無法直接求出。對於這類問題,我們往往先把它分解成幾個子問題,找到求出這幾個子問題的解法後,再找到合適的方法,把它們組合成求整個問題的解法。如果這些子問題還較大,難以解決,可以再把它們分成幾...