分治法( Divide and Conquer)

2023-11-08

分治法也称为分解法、分治策略等。分治法算法思想如下:
(1) 将一个问题划分为同一类型的若干子问题,子问题最好规模相同。
(2) 对这些子问题求解(一般使用递归方法,但在问题规模足够小时,有时也会利用另一个算法)。
(3) 有必要的话,合并这些子问题的解,以得到原始问题的答案。
当子问题足够大时,需要递归求解时,我们称之为递归情况(Recursive Case)。当子问题变得足够小,不再需要递归时,表示递归已经“触底”,进入了基本情况(Base Case)。
以将一个问题划分为两个较小子问题为例,分治法的流程如下图所示:
分治技术实例

递归式与分治

递归式与分治方法紧密相关。因为使用递归式可以很自然地刻画分治算法的运行时间。一个递归式(Recurrence)就是一个等式或不等式,它通过更小的输入上的函数值来描述一个函数。如使用递归式表示归并排序(Merge Sort)的最坏运行时间 T ( n ) T(n) T(n)
T ( n ) = O ( 1 ) ( n = 1 ) T(n) = O(1) (n=1) T(n)=O(1)(n=1)
T ( n ) = 2 T ( n / 2 ) + O ( n ) ( n > 1 ) T(n) = 2T(n/2) + O(n) (n>1) T(n)=2T(n/2)+O(n)(n>1)
其中 O ( 1 ) O(1) O(1)表示在常数级别求解问题。
《算法导论》给出三种求解递归式方法,即得出算法的“O”的渐近界的方法。他们是:(1) 代入法:猜测一个界,然后用数学归纳法证明这个界是正确的;(2) 递归树法:将递归式转换为一棵树,其其结点表示不同层次的递归调用产生的代价。然后采用边界和技术来求解递归式;(3) 主方法:可求解公式的递归式的界。

代入法

代入法也称代换法。代入法先猜测界的形式,然后使用数学归纳法证明这个界是正确的。本质上是数学归纳法在递归式求解的应用。实现步骤如下:
(1) 根据经验(如对比、类比、分类等等)等方式,猜测解的形式;
(2) 用数学归纳法求出解中的常数,并证明解是正确的。
之所以将其称为代入法,是因为需要将猜测的解代入函数。注意,不存在通用的方法来猜测递归式的正确解,猜测解要靠经验,偶尔还需要创造力。但是,有一些启发式方法帮助成为好的猜测者。如将当前问题和之前处理过的问题做类比、对比;先证明较宽松的上界和下界,然后缩写不确定的范围。

递归树法

可以使用递归树表示递归式。在递归树中,每一个结点表示一个单一子问题的代价,子问题对应某次递归函数调用。我们将树中每层中的代价求和,得到每层代价,然后将所有层的代价求和,得到所有层次的递归调用总代价。
递归树最适合用来生成好的猜测,然后可用代入法来验证猜测是否正确。当使用递归树来生成好的猜测时,常常要忍受一点儿“不精确”,因为关注的是如何寻找解的一个上界。使用递归树生成好的猜测的步骤如下:
(1) 分析问题,得出递归式
(2) 基于递归式创建递归树
(3) 计算递归树的代价
(4) 对代价进行“不精确处理”,推导出猜测

主方法

主方法仅适用于分治法的递归式。主方法依赖主定理。在介绍主方法前,先介绍下主定理。假设我们有递推关系式:
T ( n ) = a T ( n / b ) + f ( n ) T(n) = aT(n/b) + f(n) T(n)=aT(n/b)+f(n)
其中, n n n为问题的规模、 a a a为递推下子问题的数量, n / b n/b n/b为每个子问题的规模, f ( n ) f(n) f(n)为递推后做的额外工作。
(1) 若存在常量 ϵ > 0 \epsilon>0 ϵ>0,使得 f ( n ) = O ( n l o g b ( a ) − ϵ ) f(n) = O(n^{log_b^{(a)-\epsilon}}) f(n)=O(nlogb(a)ϵ),则 T ( n ) = θ ( n l o g b a ) T(n) = θ(n^{log_b^a}) T(n)=θ(nlogba)
(2) 若存在常量 k > 0 k>0 k>0,使得 f ( n ) = θ ( n l o g b a l o g k n ) f(n)= θ(n{log_b^alog^kn}) f(n)=θ(nlogbalogkn),则 T ( n ) = θ ( n l o g b a l o g k + 1 n ) T(n)= θ(n{log_b^alog^{k+1}n}) T(n)=θ(nlogbalogk+1n)
(3) 若存在常数 ϵ > 0 \epsilon>0 ϵ>0,有 f ( n ) = Ω ( n l o g b ( a ) + ϵ ) f(n)=Ω(n{log_b^{(a) + \epsilon}}) f(n)=Ω(nlogb(a)+ϵ),同时存在常数c<1,以及充分大的n满足 a f ( n / b ) ≤ c f ( n ) af(n/b)≤cf(n) af(n/b)cf(n),那么 T ( n ) = θ ( f ( n ) ) T(n)=θ(f(n)) T(n)=θ(f(n))
主定理的证明可以参考《算法导论》证明主定理一节。
在使用主定理前,先理解下其含义。首先将函数 f ( n ) f(n) f(n)与函数 n l o g b a n{log_b^a} nlogba进行比较。如果函数 f ( n ) f(n) f(n)小于函数 n l o g b a n{log_b^a} nlogba,则 T ( n ) = θ ( n l o g b a ) T(n) = θ(n^{log_b^a}) T(n)=θ(nlogba)。注意,这里是多项式意义上的小于。如果函数 f ( n ) f(n) f(n)大于函数 n l o g b a n{log_b^a} nlogba,则 T ( n ) = θ ( f ( n ) ) T(n)=θ(f(n)) T(n)=θ(f(n))。注意,这里同样是多项式意义上的大于。
注意,这三种情况并未覆盖 f ( n ) f(n) f(n)的所有可能性。情况1和情况2之间有一定间隙, f ( n ) f(n) f(n)可能小于 n l o g b a n{log_b^a} nlogba,但不是多项式意义上的小于。类似的,情况2和情况3之间也有一定间隙, f ( n ) f(n) f(n)可能大于 n l o g b a n{log_b^a} nlogba,但不是多项式意义上的大于。如果 f ( n ) f(n) f(n)落在上述两个间隙中,就不能使用主方法来求解递归式。
接下来介绍如何使用主方法。使用主方法很简单,只需要确定主定理哪种情况成立,即可得到解。具体步骤如下:
(1) 根据递推式获得a, b, f ( n ) f(n) f(n)的值;
(2) 计算 n l o g b a n{log_b^a} nlogba;
(3) 基于 n l o g b a n{log_b^a} nlogba表示 f ( n ) f(n) f(n),并明确ε,进而明确对应的情况(考虑间隙问题)
(4) 获取代价

经典使用场景

接下来将从实践出发,在实际场景中使用分治算法。

归并排序

归并排序,默认指二路归并排序。归并排序是使用分治法实现的排序之一。假设初始序列含有n个元素,则可看成n个有序的子序列,每个子序列的长度是1。然后将前后相邻的两个有序序列归并为一个有序序列。这与分治法**将一个问题划分为同一类型的若干子问题,对这些子问题求解,合并这些子问题的解的思路是一致的。更多相关介绍可以参考归并排序一文。

快速排序

和归并排序一样,快速排序也是基于分治技术实现的算法。与归并排序按照元素在列表中的位置进行划分不同,快速排序是按照元素的值进行划分。快速排序的基本思想是,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使整个数据变成有序序列。更多相关介绍可以参考快速排序一文。

二叉树问题

因为二叉树可以划分为同样类型的两个更小的组成部分——左子树和右子树,所以许多关于二叉树的问题都可以应用分治法来解决。二叉树是由三个基本单元组成:根结点、左子树和右子树。因此,若能依次遍历这三部分,就能遍历整个二叉树。更多相关介绍可以参考二叉树一文。

参考

《算法导论》 第三版 Tomas H. Cormen etc. 殷建平 等译 第四章 分治策略
《算法设计与分析基础》第三版 Anany Levitin 著 潘彦 译 第五章 分治法
https://blog.csdn.net/u010013164/article/details/38819959 [算法导论] 递归式求解的三种方法
https://leetcode-cn.com/ leetcode

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分治法( Divide and Conquer) 的相关文章

  • 人工神经网络和神经网络,人工神经网络排名第一

    当今人工神经网络界的顶尖人物 5 Donald O Hebb Hebbian learning John J Hopfield Hopfield NN classic recurrent NN Stephen Grossberg Gross
  • BUCK电路分析设计(一)/备忘

    用于DC DC转换的降压型BUCK电路如图所示 基本工作原理为 输入一占空比为D的脉冲信号 当信号低电平时PMOS开启 NMOS关闭 电源通过PMOS 流经电感 并对电容与负载充电 电感电流线性上升 斜率为 VIN VO L 当信号为高电平
  • STM32学习记录2 1.26

    本人为纯纯初学者 水平非常低 写文章只是为了记录学习经历 并且输出文字加强理解与记忆 本文十分不严谨 只具参考作用 可能具有误导性 请谨慎阅读 如果各位dalao发现错误 欢迎友善的指正 建议与讨论 初入CSDN 对平台的规范不是很熟悉 还
  • 手机数据线连接电脑,电脑不仅可以读定手机文件,还可以通过手机热点进网...

    环境 一台正在通WIFI上网的手机 红米2 一台不能上网的华硕笔记本电脑 1 打开手机的设置 gt 其他连接方式 gt 网络热点 然后可以看到这样的一个名称 USB共享网络 这是个开关 默认的灰色的 当手机用数据线连接笔记本的电脑的时候 它
  • 什么是分而治之?

    分而治之 从语文上来说 有两个意思 1 分别治理 2 利用手段使国家 民族或宗教等产生分裂 然后对其进行控制和统治 而从软件工程来看 是一种方法 是有效算法设计中普遍采用的一种技术 所谓 分而治之 就是把一个复杂的算法问题按一定的 分解 方

随机推荐

  • 动力节点Spring Boot3项目版实战教程,学练一体,轻松掌握

    Spring Boot 3是一个非常令人期待的版本 将进一步扩大Spring Boot框架在应用程序开发领域的影响力 并带来更加出色的开发体验 Spring Boot 3的推出 带来个更多的新特性和功能 也为开发人员提供更高效 更优秀的开发
  • 中医四诊之五音 --详解

    from 老中医 LaoZY cn 医家箴言 肝呼应角 心言应徵 脾歌应宫 肺哭应商 肾呻应羽 五脏五声 以合五音 素问 阴阳应象大论 曰 视喘息 听音声 而知所苦 盖病苦于中 声发于外 有不可诬者也 故 难经 六十一难 曰 闻其五音以别其
  • Django rest_framework开发一组RESTFUL标准接口[ModelSerializer+GenericAPIView]

    Django rest framework开发一组RESTFUL标准接口 ModelSerializer GenericAPIView 不管何等复杂的业务逻辑 不管何等高效的开发框架 对后端来说最终都要落到对具体的某一个关系模型的增删改查上
  • 各类文件对应Content-Type

    两种初始化Map常量 1 new HashMap 2 static 静态代码块 static Map
  • 微信小程序:心跳动画

    封装工具类 var app getApp module exports animationMiddleHeaderItem animationMiddleHeaderItem 心跳动画 平移动画 function animationMidd
  • linux部署jenkins报错:ModuleNotFoundError: No module named ‘XXX‘已解决

    项目场景 实现接口自动化python jenkins allure 部署环境 linux中部署jenkins容器 容器需安装jdk python环境 python脚本 放入jenkins容器中 allure 安装在容器中 jenkins配置
  • JS逆向 -- 开发者工具介绍

    一 打开方式 1 通过快捷键F12 2 通过浏览器设置打开 二 常用的功能 1 元素 显示前端的相关东西 2 控制台 可以动态获取某些变量的值 比如获取当前页面的cookie值 3 源代码 动态调试的时候用到 可以下断点查看堆栈等相关操作
  • Python3,19行代码,我把她的照片写入到Excel中,2022年伊始,她终于被我感动了。

    19行代码 把图片写到如excel 1 引言 2 代码实战 2 1 思路 2 2 文件准备 2 3 实战 2 3 1 安装 2 3 2 代码实战 3 总结 1 引言 小屌丝 鱼哥 新年快乐 小鱼 新年快乐 小屌丝 虽然是元旦 但是也算是迈入
  • Python 安装第三方库详解(含离线)

    文章目录 1 Python 在线安装第三方库 1 1 在 cmd 中运行 pip install xx 1 2 在 Pycharm 中安装 2 Python 离线安装第三方库 2 1 从官方库下载 1 Python 在线安装第三方库 1 1
  • 深度学习图像增强---python库imgaug

    图像增强python库imgaug landmark 增强 segmentation 增强 imgaug用来做图像增强的一个python库 1 图像增强是在小样本以及提高模型泛化能力的通常采用的措施 下面总结一下我之前用到过的一些内容 la
  • 虚拟机网卡不见了

    有的时候不知道为什么虚拟机就是不能上网 郁闷 排除了虚拟机网卡被禁用之类的原因的话 看下系统时间 如果没有跟物理机器时间一致 改成一样试试看
  • DBA典型的工作职责

    下面不是全部列表 但是包括了DBA的典型职责 把监视数据库实例当作每日必做工作以保证其可用性 解决不可用的问题 收集系统统计和性能信息以便定向和配置分析 配置和调整数据库实例以便在应用程序特定要求下达到最佳性能 分析和管理数据库安全性 控制
  • diff和patch使用指南

    diff和patch是一对工具 在数学上来说 diff是对两个集合的差运算 patch是对两个集合的和运算 diff比较两个文件或文件集合的差异 并记录下来 生成一个diff文件 这也是我们常说的patch文件 即补丁文件 patch能将d
  • 苹果手机忘记密码锁屏了怎么办,有什么处理方法可解

    我们平时用手机 不管什么牌子的手机 都会设置锁屏密码 是为更好的保护自己的隐私信息 但人有时候就是会犯这样的蠢事 蠢到自己都想哭 就是忘记锁屏密码 手机打不开 要是遇到什么急事 真的是快被自己气死 以苹果手机为例 那接下来由小编分享苹果手机
  • Prometheus(五)——PromQL介绍

    这里写自定义目录标题 PromQL介绍 基本用法 查询时间序列 完全匹配 正则匹配 范围查询 时间位移操作 使用聚合操作 标量和字符串 标量 Scaler 字符串 合法的PromQL表达式 合法规则 标签名称的表达 PromQL操作符 数学
  • tq210-uboot spl 和 stage 2 启动

    将OK210的代码稍微改了改 如下 1 mem初始化更改 因为ok210为512M 而tq210为1G内存 2 ok210使用串口0为debug 口 3 ok210的sd卡在通道0上 主要是利用SD卡启动 SOC首先读取SD的SPL部分到s
  • Mybatis中关于返回值的问题

    Mybatis中关于返回值的问题 结论 在Mybatis的xml中 可以使用resultType 来指定其返回值的类型 但如果sql语句执行的结果为空 则会返回null 问题描述 在写Mybatis中的select语句 因为查找的条件 很有
  • 11.全志H3-AD使用记录

    上面是我的微信和QQ群 欢迎新朋友的加入 修改PCB默认字体 网上大多数教程都是改这里 我的操作是这个default里面 从头找到尾 凡是丝印层的 全改成自己想要的字体 原理图选中之后 PCB没有变化
  • 华清 c++ day5 9月12

    ifndef HOMEWORK H define HOMEWORK H include
  • 分治法( Divide and Conquer)

    分治法也称为分解法 分治策略等 分治法算法思想如下 1 将一个问题划分为同一类型的若干子问题 子问题最好规模相同 2 对这些子问题求解 一般使用递归方法 但在问题规模足够小时 有时也会利用另一个算法 3 有必要的话 合并这些子问题的解 以得