算法- 遞歸算法 分治算法

遞歸算法

(1)遞歸需要滿足的三個條件

  • 一個問題的解可以分解爲幾個子問題的解

    何爲子問題?子問題就是數據規模更小的問題。

  • 這個問題與分解之後的子問題,除了數據規模不同,求解思路完全一樣

  • 存在遞歸終止條件

    把問題分解爲子問題,把子問題再分解爲子子問題,一層一層分解下去,不能存在無限循環,這就需要有終止條件。

(2)如何編寫遞歸代碼?

寫遞歸代碼的關鍵就是找到如何將大問題分解爲小問題的規律,並且基於此寫出遞推公式,然後再推敲終止條件,最後將遞推公式和終止條件翻譯成代碼。

編寫遞歸代碼的關鍵是,只要遇到遞歸,我們就把它抽象成一個遞推公式,不用想一層層的調用關係,不要試圖用人腦去分解遞歸的每個步驟。

(3)遞歸的弊端:

遞歸有利有弊,利是遞歸代碼的表達力很強,寫起來非常簡潔;而弊就是空間複雜度高、有堆棧溢出的風險、存在重複計算、過多的函數調用會耗時較多等問題。

分治算法

(1)什麼是分治算法

分治算法(divide and conquer)的核心思想其實就是四個字,分而治之 ,就是把一個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。

(2)基本思想及策略

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

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

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

(3)分治法適用的情況

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

  • 該問題的規模縮小到一定的程度就可以容易地解決
  • 該問題可以分解爲若干個規模較小的相同問題,即該問題具有最優子結構性質。
  • 利用該問題分解出的子問題的解可以合併爲該問題的解;
  • 該問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子子問題。

(4)分治法的基本步驟

  • 分解:將原問題分解爲若干個規模較小,相互獨立,與原問題形式相同的子問題;
  • 解決:若子問題規模較小而容易被解決則直接解,否則遞歸地解各個子問題
  • 合併:將各個子問題的解合併爲原問題的解。

遞歸使用的就是分治的思想,它是分治思想的一種具體實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章