分治、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 为止
        《分治、CDQ分治小结(need to be updated)》

    • 替换法

      替换法是先猜测某个界存在,再用数学归纳法证明正确性,通过解决表达式中的常数 c 来验证答案。
      举例说明,用替换法证明 T(n)=T(n/4)+T(n/2)+n2 的解为 Θ(n2) ,即分别证明 T(n)=O(n2) T(n)=Ω(n2)
      《分治、CDQ分治小结(need to be updated)》

    • 主定理

      • 主定理
        递归表达式 T(n)=aT(n/b)+f(n)
        T(n) 可能有如下的渐进界:
        《分治、CDQ分治小结(need to be updated)》

      • 主定理的形象解释
        《分治、CDQ分治小结(need to be updated)》

      • T(n)=aT(n/b)+f(n) 的递归树
        《分治、CDQ分治小结(need to be updated)》

        case 1 情况下,递归树的每层成本从根向下呈几何级数增长,成本在叶节点一层达到最高,即最后一次递归是整个过程中成本最高的一次,故其占主导地位。所以递归分治的总成本在渐进趋势上和叶子层的成本一样。
        case 2 情况下,递归树每层的成本在渐进趋势上一样,即每层都是 nlogba 。由于有 logbn 层,因此总成本为每层的成本乘以 logbn
        case 3 情况下,递归树每层成本呈几何级数递减,树根一层的成本占主导地位。因此,总成本就是树根层的成本。

      • 主定理证明

        • case 1 由所有叶结点的代价决定
          《分治、CDQ分治小结(need to be updated)》

        • case 2 树的代价均匀地分布在各层上
          《分治、CDQ分治小结(need to be updated)》

        • case 3 由根结点的代价决定
          《分治、CDQ分治小结(need to be updated)》

          特别说明:
          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. 动态问题

    原文作者:递归与分治算法
    原文地址: https://blog.csdn.net/lwt36/article/details/50625573
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞