分治、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 Divide
      将原问题划分为若干个子问题,子问题间互相独立且与原问题形式相同
    • 解决 Conquer Conquer
      递归解决子问题(递归是彰显分治优势的工具,仅仅进行一次分治策略也许微不足道,
      但递归划分到子问题规模足够小,子问题的解可用常数时间解决)
    • 合并 Merge Merge
      将各子问题的解合并得到原问题的解
  • 时间复杂度

    • 直观估计

      • 分治由以上三部分构成,整体的时间复杂度则由这三部分的时间复杂度之和构成。
      • 由于递归,最终的子问题变得极为简单,以至于其时间复杂度在整个分治策略上的比重微乎其微
        每次划分的子问题数是多少?每次划分与合并需要的时间是多少?
    • 递归表达式与递归树

      • 递归表达式
        一般来说,分治将问题划分为 a a个同型子问题,子问题的规模是n/bn/b,常数 a≥1, b>1 a\ge1,\ b>1
        f(n) f(n)是划分与合并 a a个大小为n/bn/b的子问题的时间成本
        f(n) f(n)是一个渐进趋正的函数( ∃n0, 当n>n0, 有f(n)>0 \exists n_0,\ 当n>n_0,\ 有f(n)>0)
        递归表达式:T(n)=aT(n/b)+f(n) 递归表达式:T(n) = aT(n/b) + f(n)

      • 递归树
        递归树是抽象的递归表达式具体化的图形表示,它给出的是一个算法递归执行的成本模型。
        比如归并排序算法模型以输入规模为 n n开始,一层一层划分,直到输入规模变为11为止

    • 替换法

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

    • ∗ *主定理

      • 主定理
        递归表达式T(n)=aT(n/b)+f(n)T(n) = aT(n/b) + f(n)
        T(n) T(n)可能有如下的渐进界:

      • 主定理的形象解释

      • T(n)=aT(n/b)+f(n) T(n) = aT(n/b) + f(n)的递归树

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

      • 主定理证明

        • case 1 case\ 1由所有叶结点的代价决定

        • case 2 case\ 2树的代价均匀地分布在各层上

        • case 3 case\ 3由根结点的代价决定

          特别说明:
          f(n) f(n)代表的是分治中的划分和合并的成本。由于 f(n) f(n)的渐进增长趋势 >Θ(nlogba) >Θ(n^{log_ba}),
          所以该分治的划分和合并的成本高于子问题的解决成本。而如果在这种情况要获得解,划分和合并的成本应该逐级下降
          否则,划分和合并成本随着划分的推进将呈现发散趋势,这样总成本有可能不会收敛。那么这种分治就显得没有意义了
          而如果划分与合并成本逐级下降,则意味着函数 f f满足af(n/b)<=cf(n), c<1af(n/b)。
          因此,解为 T(n)=Θ(f(n)) T(n)=Θ(f(n))


    算法课就没去过几节,算导上主定理讲的也不是很详细,其实分析时间复杂度挺好玩的
    转载整理上面的东西主要就是弥补之前书看不懂,课没去听吧,更多的还是结合做题以及具体算法理解吧
    普通分治也不太用讲具体的东西,概念清楚,只要按照步骤来就很简单,并且有现成的例子来结合思考
    两大杀器:快速幂、归并排序。举(照)一(猫)反(画)三(虎)即可

    Ⅱ. CDQ分治

    • 与普通分治的区别
      普通分治中,每一个子问题只解决它本身(可以说是封闭的)
      CDQ CDQ分治中,对于划分出来的两个子问题,前一个子问题用来解决后一个子问题而不是它本身

    • 适用的情况
      在很多问题中(比如大多数数据结构题),经常需要处理一些动态问题
      然而对动态问题的处理总是不如静态问题来的方便,于是就有了 CDQ CDQ分治
      但使用 CDQ CDQ分治的前提是问题必须具有以下两个性质:

      • 修改操作对询问的贡献独立,修改操作互不影响效果
      • 题目允许使用离线算法。
    • 一般步骤

      • 将整个操作序列分为两个长度相等的部分(分)
      • 递归处理前一部分的子问题(治1)
      • 计算前一部分的子问题中的修改操作对后一部分子问题的影响(治2)
      • 递归处理后一部分子问题(治3)

      特别说明:
      在整个过程中,最核心的就是步骤3
      此时前一部分子问题中的修改操作相对后一部分子问题来说是静态处理,因此可以更加方便地计算后一部分子问题

    Ⅲ. CDQ分治的题目讲解

    怎么学,强撸题吧,持续更新 ing ing

    1. 静态问题

    • 51nod 1376 最长递增子序列的数量
      入门题の二维偏序,经典题目,点击查看题解

    • BZOJ 3262 陌上花开
      入门题の三维偏序,经典题目,点击查看题解

    • HDU 4742 Pinball Game 3D
      入门题の三维偏序, 求最长链以及数目,点击查看题解

    2. 动态问题

分治、CDQ分治小结(need to be updated)相关推荐

  1. 点分治+CDQ分治+整体二分全纪录

    点分治 点分治讲解 解决树上路径问题 经典例题:点分治(长度小于m的路径计数) 经典例题:点分治(聪聪可可) 经典例题:点分治(多个定值路径计数) 经典例题:点分治(采药) 经典例题:点分治+ST表+ ...

  2. 浅谈CDQ分治与偏序问题

    初识CDQ分治 CDQ分治是一个好东西,一直听着dalao们说所以就去学了下. CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. ...

  3. CDQ分治——学习笔记

    前言 因为中国集训队的大佬们总会发明一些新的东西,所以中国的计算机竞赛水平才会一直处于国际前沿,而cdq分治也是某一年的集训队成员发明的算法. 什么是CDQ分治 cdq分治是一种分治(这不是废话嘛), ...

  4. [总结]CDQ分治整体二分

    从昨天到现在除了90%的颓废时间一直在研究一些分治的姿势,主要就是CDQ分治和整体二分. 首先推荐一些学习资料: 陈丹琦 <从 < Cash > 谈一类分治算法的应用> 许昊然 ...

  5. 三维偏序/cdq分治/

    三维偏序---cdq分治 cdq分治概述 二维偏序概述 二维偏序例题分析 三维偏序概述 例题分析 cdq分治概述 前置知识:(如果不懂要先去了解分治) > 分治: > 分而治之,将原问题不 ...

  6. CDQ分治(二维CDQ 、三维CDQ+树状数组、四维CDQ+CDQ+树状数组)

    CDQ分治 CDQ分治相较于普通分治,多了左区间处理后对于右区间的影响. 利用这一点,CDQ分治可以用来做很多数据结构的题目(树状数组.线段树),加一个log的时间复杂度来优化一维. 操作: 假设有两 ...

  7. CDQ分治【分治(真得头疼)

    前言: 说实话我对于这种没有固定板子,变化多端的算法实在是非常头疼的 但是不学不行,这也是一种很重要的思伟方式 所以趁着这几天的心情比较好(快要放大周),赶紧学一波~ 鸣谢:tham,stdcall ...

  8. 分治、CDQ分治小结

    分治.CDQ分治小结 A Summary for Divide and Conquer 0. Anouncement 本文部分图片以及部分内容来自互联网,内容过多就不一一注明出处了,冒犯之处还请海涵. ...

  9. 【BZOJ-3456】城市规划 CDQ分治 + NTT

    题目链接 http://www.lydsy.com/JudgeOnline/problem.php?id=3456 Solution 这个问题可以考虑dp,利用补集思想 N个点的简单图总数量为$2^{ ...

最新文章

  1. Python运维开发基础01-语法基础【转】
  2. 前端如何搭建一个成熟的脚手架
  3. java的输出的例子_Java例子:万年历的输出
  4. C++ Primer 5th笔记(7)chapter7 类
  5. 探索Flutter_Image显示Webp逻辑
  6. java 动态规划视频_157-动态规划算法解决背包问题1
  7. Vuejs模拟Ajax请求接口(天气预报API)跨域问题 - 案例篇
  8. struts2 过滤器和拦截器的区别和使用
  9. 点云谱聚类实现代码_Spark跑DBSCAN算法,工业级代码长啥样?
  10. toxic comment classification 数据集
  11. OpenCV 图像编解码操作【imencode/imdecode】使用
  12. html5 牧场游戏,手机QQ首批五款HTML5游戏名单 农场偷菜复活
  13. 中国石油大学《机械基础(设计与制造)》第二阶段在线作业
  14. Python基础数据类型:字符串,列表,元组,集合,字典用法总结
  15. VBA 中Dim含义
  16. 如何遮挡电影英汉字幕
  17. Heka nginx input
  18. 用Meta标签代码让360双核浏览器默认极速模式打开网站不是兼容模式
  19. 车站安防巡逻机器人未来发展趋势是什么?
  20. matlab 眼图 值,Matlab通信仿真——带限系统下的基带信号

热门文章

  1. Vue+element ui表单中省市区级联选择—v-distpicker/Cascader
  2. html四舍五入函数,Javascript四舍五入(Math.round()与Math.pow())
  3. 51单片机学习笔记(清翔版)(25)——LCD1602和指针
  4. 后摩尔时代来临,语音IC封装技术一触即发
  5. 【渝粤题库】陕西师范大学165106 冲突与沟通管理作业 (高起专)
  6. IDEA修改背景颜色(护眼绿)
  7. PyCharm 安装numpy包
  8. 【STM32】SPI协议通信详解
  9. Lined List 链表总结 Reverse链表 - 反转(python) leetcode 206 92
  10. CTreeCtrl的HitTest用法