1. 程式人生 > >五大常用演算法之一:分治演算法(轉)

五大常用演算法之一:分治演算法(轉)

分治演算法

一、基本概念

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

    任何一個可以用計算機求解的問題所需的計算時間都與其規模有關。問題的規模越小,越容易直接求解,解題所需的計算時間也越少。例如,對於n個元素的排序問題,當n=1時,不需任何計算。n=2時,只要作一次比較即可排好序。n=3時只要作3次比較即可,…。而當n較大時,問題就不那麼容易處理了。要想直接解決一個規模較大的問題,有時是相當困難的。

二、基本思想及策略

   分治法的設計思想是:將一個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之

   分治策略是:對於一個規模為n的問題,若該問題可以容易地解決(比如說規模n較小)則直接解決,否則將其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解這些子問題,然後將各子問題的解合併得到原問題的解。這種演算法設計策略叫做分治法。

   如果原問題可分割成k個子問題,1<k≤n,且這些子問題都可解並可利用這些子問題的解求出原問題的解,那麼這種分治法就是可行的。由分治法產生的子問題往往是原問題的較小模式,這就為使用遞迴技術提供了方便。在這種情況下,反覆應用分治手段,可以使子問題與原問題型別一致而其規模卻不斷縮小,最終使子問題縮小到很容易直接求出其解。這自然導致遞迴過程的產生。分治與遞迴像一對孿生兄弟,經常同時應用在演算法設計之

中,並由此產生許多高效演算法。

三、分治法適用的情況

    分治法所能解決的問題一般具有以下幾個特徵:

    1) 該問題的規模縮小到一定的程度就可以容易地解決

    2) 該問題可以分解為若干個規模較小的相同問題,即該問題具有最優子結構性質

    3) 利用該問題分解出的子問題的解可以合併為該問題的解;

    4) 該問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子子問題

第一條特徵是絕大多數問題都可以滿足的,因為問題的計算複雜性一般是隨著問題規模的增加而增加;

第二條特徵是應用分治法的前提它也是大多數問題可以滿足的,此特徵反映了遞迴思想的應用;、

第三條特徵是關鍵,能否利用分治法完全取決於問題是否具有第三條特徵

,如果具備了第一條和第二條特徵,而不具備第三條特徵,則可以考慮用貪心法或動態規劃法

第四條特徵涉及到分治法的效率,如果各子問題是不獨立的則分治法要做許多不必要的工作,重複地解公共的子問題,此時雖然可用分治法,但一般用動態規劃法較好

四、分治法的基本步驟

分治法在每一層遞迴上都有三個步驟:

    step1 分解:將原問題分解為若干個規模較小,相互獨立,與原問題形式相同的子問題;

    step2 解決:若子問題規模較小而容易被解決則直接解,否則遞迴地解各個子問題

    step3 合併:將各個子問題的解合併為原問題的解。

它的一般的演算法設計模式如下:

    Divide-and-Conquer(P)

    1. if |P|≤n0

    2. then return(ADHOC(P))

    3. 將P分解為較小的子問題 P1 ,P2 ,...,Pk

    4. for i←1 to k

    5. do yi ← Divide-and-Conquer(Pi) △ 遞迴解決Pi

    6. T ← MERGE(y1,y2,...,yk) △ 合併子問題

    7. return(T)

    其中|P|表示問題P的規模;n0為一閾值,表示當問題P的規模不超過n0時,問題已容易直接解出,不必再繼續分解。ADHOC(P)是該分治法中的基本子演算法,用於直接解小規模的問題P。因此,當P的規模不超過n0時直接用演算法ADHOC(P)求解。演算法MERGE(y1,y2,...,yk)是該分治法中的合併子演算法,用於將P的子問題P1 ,P2 ,...,Pk的相應的解y1,y2,...,yk合併為P的解。

五、分治法的複雜性分析

    一個分治法將規模為n的問題分成k個規模為n/m的子問題去解。設分解閥值n0=1,且adhoc解規模為1的問題耗費1個單位時間。再設將原問題分解為k個子問題以及用merge將k個子問題的解合併為原問題的解需用f(n)個單位時間。用T(n)表示該分治法解規模為|P|=n的問題所需的計算時間,則有:

T(n)= k T(n/m)+f(n)

    通過迭代法求得方程的解:

    遞迴方程及其解只給出n等於m的方冪時T(n)的值,但是如果認為T(n)足夠平滑,那麼由n等於m的方冪時T(n)的值可以估計T(n)的增長速度。通常假定T(n)是單調上升的,從而當                  mi≤n<mi+1時,T(mi)≤T(n)<T(mi+1)。 

六、可使用分治法求解的一些經典問題 (1)二分搜尋 (2)大整數乘法 (3)Strassen矩陣乘法 (4)棋盤覆蓋 (5)合併排序 (6)快速排序 (7)線性時間選擇 (8)最接近點對問題 (9)迴圈賽日程表 (10)漢諾塔 七、依據分治法設計程式時的思維過程     實際上就是類似於數學歸納法,找到解決本問題的求解方程公式,然後根據方程公式設計遞迴程式。 1、一定是先找到最小問題規模時的求解方法 2、然後考慮隨著問題規模增大時的求解方法 3、找到求解的遞迴函式式後(各種規模或因子),設計遞迴程式即可。

相關推薦

【C++實現】五大常用演算法之一分治演算法例項漢諾塔

求解思想:大而化小 1、問題拆分成子問題 2、對子問題求解 在漢諾塔遊戲中,有三個分別命名為A、B、C得塔座,幾個大小各不相同,從小到大一次編號得圓盤,每個原盤中間有一個小孔。最初,所有得圓盤都在A塔座上,其中最大得圓盤在最下面,然後是第二大,以此類推. 先上程式

五大常用演算法之一分治演算法

分治演算法 一、基本概念    在電腦科學中,分治法是一種很重要的演算法。字面上的解釋是“分而治之”,就是把一個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。這個技巧是很多高效演算法的基礎,如排序演算法(快速排序,

五大常用演算法之一分治演算法(轉載)

轉載自:http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741370.html 一、基本概念    在電腦科學中,分治法是一種很重要的演算法。字面上的解釋是“分而治之”,就是把一個複雜的問題分成兩個或更多的相

深入理解Tomcat系列之一系統架構

前言 Tomcat是Apache基金組織下的開源專案,性質是一個Web伺服器。下面這種情況很普遍:在eclipse床架一個web專案並部署到Tomcat中,啟動tomcat,在瀏覽器中輸入一個類似http://localhost:8080/webproject/anyname.jsp的url,然後就可以看到

資料結構與演算法分析線性結構3

堆疊 1.計算機如何進行表示式求值     算術表示式: 由兩類物件構成:運算數,運算子號 不同運算子號優先順序不同    ①中綴表示式:把運算子號放在兩個運算數之間:a+b*c-d/e     &

JAVA程式碼—演算法基礎跳躍遊戲II

跳躍遊戲(Jump Game II) 問題描述: Given an array of non-negative integers, you are initially positioned at the first index of the array.

演算法筆記動態規劃DP初步

專題:動態規劃(DP)初步 內容來源:《挑戰程式設計競賽》(第2版)+《演算法競賽入門經典》(第2版)+網上資料整理彙總 一、引入         動態規劃程式設計是對解最優化問題的一種途徑、一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有

JAVA虛擬機器之一垃圾回收GC機制

引言 java對於其它語言(c/c++)來說,建立一個物件使用後,不用顯式的delete/free,且能在一定程度上保證系統記憶體資源及時回收,這要功歸於java的自動垃圾回收機制(Garbage Collection,GC),但也是因為自動回收機制存在,一旦系統內洩漏或存

用於求最近公共祖先(LCA)的 Tarjan演算法–以POJ1986為例

給定有向無環圖(就是樹,不一定有沒有根),給定點U,V,找出點R,保證點R是U,V的公共祖先,且深度最深;或者理解為R離這兩個點的距離之和最小.如何找出R呢? 最一般的演算法是DFS(DFS本是深度優先搜尋,在這裡姑且把深度優先遍歷也叫做DFS,其實是

遞迴演算法詳細分析-> C

C通過執行時堆疊支援遞迴函式的實現。遞迴函式就是直接或間接呼叫自身的函式。 許多教科書都把計算機階乘和菲波那契數列用來說明遞迴,非常不幸我們可愛的著名的老潭老師的《C語言程式設計》一書中就是從階乘的計算開始的函式遞迴。導致讀過這本經書的同學們,看到階乘計算第一個想法就是遞迴

Oracle數據庫測試和優化最佳實踐 OTest介紹

1-1 log 數據 bsp 下載 pan alt style 發送 當前Oracle數據庫最佳測試工具OTest * Otest是用於Oracle數據庫測試、優化、監控軟件。 * Otest是免費提供給Oracle客戶和廣大DBA工程師使用的軟件。由原廠技

23種設計模式9訪問者模式

類方法 打印 interface 增加 http col visitor 設計模式的 接口 定義:封裝某些作用於某種數據結構中各元素的操作,它可以在不改變數據結構的前提下定義作用於這些元素的新的操作。 類型:行為類模式 類圖: 訪問者模式可能是行為類模式中最

Android開發 adb命令提示Permission denied

模擬 ont lang rmi title fontsize fcm hbm ssi 如題:模擬器版本->android 7.1.1 遇到這樣的情況把模擬器root一下就好了:su root =============2017年4月3日20:57:33========

Systemd入門教程命令篇

apache 完整 start -o 一是 analyze sudo one iso 作者: 阮一峰 日期: 2016年3月 7日 Systemd 是 Linux 系統工具,用來啟動守護進程,已成為大多數發行版的標準配置。 本文介紹它的基本用法,分

Systemd入門教程實戰篇

現在 重啟 penssh span 日誌 才會 查看 筆記本 dep 作者: 阮一峰 日期: 2016年3月 8日 上一篇文章,我介紹了 Systemd 的主要命令,今天介紹如何使用它完成一些基本的任務。 一、開機啟動 對於那些支持 Systemd 的軟

翻譯Libevent參考手冊前言 (二)

1  從一萬英尺外看LibeventLibevent是用於編寫高速可移植非阻塞IO應用的庫,其設計目標是:v 可移植性:使用libevent編寫的程式應該可以在libevent支援的所有平臺上工作。即使沒有好的方式進行非阻塞IO,libevent也應該支援一般的方式,讓程式可以在受限的環境中執行。v 速度:l

OpenStack部署應用第六篇儀表盤Horizon

1、儀表盤服務Horizon介紹   Dashboard(horizon)是一個web介面,使得雲平臺管理員以及使用者可以管理不同的Openstack資源以及服務。這個部署示例使用的是 Apache Web 伺服器。   dashboard僅在核心服務中要求認證服務。你可以將dashboard與其他服務,如映

五大常用演算法之五分支限界法

轉載自:http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741378.html 一、基本描述     類似於回溯法,也是一種在問題的解空間樹T上搜索問題解的演算法。但在一般情況下,分支限界法與回溯法的求解目標

常用演算法分治演算法、動態規劃演算法、貪心演算法、回溯法、分支限界法

1、概念     回溯演算法實際上一個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就“回溯”返回,嘗試別的路徑。    回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再

[python]My Unique JsonDiff演算法——如何計算2個json串之間的差距並Diff出來編輯距離Levenshtein演算法

    啊啊,年底忙著簽證什麼的,好久沒寫日誌啦。。。。新年到來,整點乾貨出來給大家~~順便為自己考試和申請學校攢點人品~~     之前實習的時候,因為實習公司的業務需求,需要一個比對json字串差異的演算法,然而我在網上查了很久的資料,發現竟然沒有現成