分治、CDQ分治小結(need to be updated)

分治、CDQ分治小結 A Summary for Divide and Conquer

0. Anouncement

本文部分圖片以及部分內容來自互聯網,內容過多就不一一註明出處了,冒犯之處還請海涵。
Some of the pictures and the content of the text come from the Internet.
Due to plenty of the content, there will be no quotation. If offended, please try to forgive me.

Ⅰ. 分治

  • 分治介紹
    分而治之,將原問題不斷劃分爲若干個子問題,直到子問題規模足夠小可以直接解決
    子問題間互相獨立且與原問題形式相同,遞歸求解這些子問題,然後將各子問題的解合併得到原問題的解

  • 一般步驟

    • 劃分 Divide
      將原問題劃分爲若干個子問題,子問題間互相獨立且與原問題形式相同
    • 解決 Conquer
      遞歸解決子問題(遞歸是彰顯分治優勢的工具,僅僅進行一次分治策略也許微不足道,
      但遞歸劃分到子問題規模足夠小,子問題的解可用常數時間解決)
    • 合併 Merge
      將各子問題的解合併得到原問題的解
  • 時間複雜度

    • 直觀估計
      • 分治由以上三部分構成,整體的時間複雜度則由這三部分的時間複雜度之和構成。
      • 由於遞歸,最終的子問題變得極爲簡單,以至於其時間複雜度在整個分治策略上的比重微乎其微
        每次劃分的子問題數是多少?每次劃分與合併需要的時間是多少?
    • 遞歸表達式與遞歸樹

      • 遞歸表達式
        一般來說,分治將問題劃分爲a 個同型子問題,子問題的規模是n/b ,常數a1, b>1
        f(n) 是劃分與合併a 個大小爲n/b 的子問題的時間成本
        f(n) 是一個漸進趨正的函數(n0, n>n0, f(n)>0
        T(n)=aT(n/b)+f(n)

      • 遞歸樹
        遞歸樹是抽象的遞歸表達式具體化的圖形表示,它給出的是一個算法遞歸執行的成本模型。
        比如歸併排序算法模型以輸入規模爲n 開始,一層一層劃分,直到輸入規模變爲1 爲止
        recursion tree

    • 替換法

      替換法是先猜測某個界存在,再用數學歸納法證明正確性,通過解決表達式中的常數c 來驗證答案。
      舉例說明,用替換法證明T(n)=T(n/4)+T(n/2)+n2 的解爲Θ(n2) ,即分別證明T(n)=O(n2)T(n)=Ω(n2)
      替換法

    • 主定理

      • 主定理
        遞歸表達式T(n)=aT(n/b)+f(n)
        T(n) 可能有如下的漸進界:
        master method

      • 主定理的形象解釋
        形象解釋

      • T(n)=aT(n/b)+f(n) 的遞歸樹
        這裏寫圖片描述

        case 1 情況下,遞歸樹的每層成本從根向下呈幾何級數增長,成本在葉節點一層達到最高,即最後一次遞歸是整個過程中成本最高的一次,故其占主導地位。所以遞歸分治的總成本在漸進趨勢上和葉子層的成本一樣。
        case 2 情況下,遞歸樹每層的成本在漸進趨勢上一樣,即每層都是nlogba 。由於有logbn 層,因此總成本爲每層的成本乘以logbn
        case 3 情況下,遞歸樹每層成本呈幾何級數遞減,樹根一層的成本占主導地位。因此,總成本就是樹根層的成本。

      • 主定理證明

        • case 1 由所有葉結點的代價決定
          case 1

        • case 2 樹的代價均勻地分佈在各層上
          case 2

        • case 3 由根結點的代價決定
          case 3

          特別說明:
          f(n) 代表的是分治中的劃分和合並的成本。由於f(n) 的漸進增長趨勢>Θ(nlogba)
          所以該分治的劃分和合並的成本高於子問題的解決成本。而如果在這種情況要獲得解,劃分和合並的成本應該逐級下降
          否則,劃分和合併成本隨着劃分的推進將呈現發散趨勢,這樣總成本有可能不會收斂。那麼這種分治就顯得沒有意義了
          而如果劃分與合併成本逐級下降,則意味着函數f 滿足af(n/b)<=cf(n), c<1
          因此,解爲T(n)=Θ(f(n))


算法課就沒去過幾節,算導上主定理講的也不是很詳細,其實分析時間複雜度挺好玩的
轉載整理上面的東西主要就是彌補之前書看不懂,課沒去聽吧,更多的還是結合做題以及具體算法理解吧
普通分治也不太用講具體的東西,概念清楚,只要按照步驟來就很簡單,並且有現成的例子來結合思考
兩大殺器:快速冪、歸併排序。舉(照)一(貓)反(畫)三(虎)即可

Ⅱ. CDQ分治

  • 與普通分治的區別
    普通分治中,每一個子問題只解決它本身(可以說是封閉的)
    CDQ 分治中,對於劃分出來的兩個子問題,前一個子問題用來解決後一個子問題而不是它本身

  • 適用的情況
    在很多問題中(比如大多數數據結構題),經常需要處理一些動態問題
    然而對動態問題的處理總是不如靜態問題來的方便,於是就有了CDQ 分治
    但使用CDQ 分治的前提是問題必須具有以下兩個性質:

    • 修改操作對詢問的貢獻獨立,修改操作互不影響效果
    • 題目允許使用離線算法。
  • 一般步驟

    • 將整個操作序列分爲兩個長度相等的部分(分)
    • 遞歸處理前一部分的子問題(治1)
    • 計算前一部分的子問題中的修改操作對後一部分子問題的影響(治2)
    • 遞歸處理後一部分子問題(治3)

    特別說明:
    在整個過程中,最核心的就是步驟3
    此時前一部分子問題中的修改操作相對後一部分子問題來說是靜態處理,因此可以更加方便地計算後一部分子問題

Ⅲ. CDQ分治的題目講解

怎麼學,強擼題吧,持續更新ing

1. 靜態問題

2. 動態問題

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