【技術文檔】《算法設計與分析導論》R.C.T.Lee等·第4章 分治策略

分治策略有一種「大事化小,小事化了」的境界,它的思想是將原問題分解成兩個子問題,兩個子問題的性質和原問題相同,所以這兩個子問題能夠再用分治策略求解,最終將兩個子問題的解合併成原問題的解。有時,咱們會有這樣的疑惑:分治策略是將原問題分解成子問題,子問題又用分治策略求解,那分治策略究竟是什麼?這種感受就像聽到有人說「由於我說我沒有作錯事,因此我沒有作錯事」同樣,讓咱們不知道他「沒有作錯事」的真正緣由是什麼。spa

對於上面的困惑,我本科的老師告誡過咱們:「對於分治策略,當大家想不明白的時候只需記住兩點:一是怎樣將問題分解成兩個子問題,二是要有遞歸出口。」舉個小例子:八個小夥伴爲肯定誰是領頭,決定比武論,兩兩比較,勝者將進入下一輪再進行兩兩比較,最終將決出一個領頭,若是咱們將這個思路倒過來想就是分治策略了,八我的分紅兩組,此時每組四人,每組決出一個領頭,再比較這兩個組的領頭就能決出最終那個領頭,而每組領頭的決出又採用將該組分紅兩組,每組兩人,這時直接比較就能決出領頭的,無需再分,此處就是遞歸的出口。說了這麼多,總結一下分治策略的步驟:遞歸

  1. 若是問題規模足夠小,那麼採起方法解決它;不然,繼續將問題劃分爲兩個子問題(小事化了
  2. 對於子問題仍採用分治策略(大事化小
  3. 將子問題的解合併成原問題的解(特別注意)

第一步、第二步是思惟的問題,只要咱們不陷入思惟的漩渦,記住處理遞歸出口就沒有問題,而第三步是細節問題,咱們經常忽略,並且不易處理,下面舉兩個例子來加以說明。方法

求二維極大點問題。在二維空間中,若是x1>x2且y1>y2,那麼稱點(x1,y1)支配點(x2,y2)。在一個二維點集中,若是一個點沒有被其它點支配,則稱這個點是極大點。爲了找出這個點集的全部極大點,能夠採用分治策略,將點集劃分紅點數更少的兩個點集,遞歸出口是:當點集只有一個點時,這個點就是這個點集的極大點。對於合併子問題的解的時候就要當心了,並非簡單地取它們的並集,而要考慮這兩個點集的極大點之間是否存在支配與被支配的關係,處理的方法很簡單:若是左子點集的極大點的y值小於右子點集中的某個極大點,則捨棄左子點集的該極大點。總結

最近點對問題:一個平面上有n個點,找出距離最近的那對點。採用分治策略,第一二步就不說了。當咱們合併這個子點集的最近點對時須要注意:原點集的最近點對的兩個端點可能在不一樣的子點集中,這就須要咱們考慮,以分割線附近的點爲圓心,以兩子點集較小的點對的距離爲半徑畫圓,判斷圓內是否存在另個點集中的點,若是存在,最短距離將更改,若是沒有,最短距離就是兩子點集較小的點對的距離思考


在大學老師告誡咱們的兩點,加上合併注意事項,就構成了採用分治策略應注意的三點:思維

  1. 思考如何將大問題分解成兩個小問題
  2. 記住遞歸出口
  3. 處理合並解的問題
相關文章
相關標籤/搜索