分治策略有一种“大事化小,小事化了”的境界,它的思想是将原问题分解成两个子问题,两个子问题的性质和原问题相同,因此这两个子问题可以再用分治策略求解,最终将两个子问题的解合并成原问题的解。有时,我们会有这样的疑惑:分治策略是将原问题分解成子问题,子问题又用分治策略求解,那分治策略到底是什么?这种感觉就像听到有人说“因为我说我没有做错事,所以我没有做错事”一样,让我们不知道他“没有做错事”的真正原因是什么。

对于上面的困惑,我本科的老师告诫过我们:“对于分治策略,当你们想不明白的时候只需记住两点:一是怎样将问题分解成两个子问题,二是要有递归出口。”举个小例子:八个小伙伴为确定谁是领头,决定比武论,两两比较,胜者将进入下一轮再进行两两比较,最终将决出一个领头,如果我们将这个思路倒过来想就是分治策略了,八个人分成两组,此时每组四人,每组决出一个领头,再比较这两个组的领头就能决出最终那个领头,而每组领头的决出又采用将该组分成两组,每组两人,这时直接比较就能决出领头的,无需再分,此处就是递归的出口。说了这么多,总结一下分治策略的步骤:

  1. 如果问题规模足够小,那么采取方法解决它;否则,继续将问题划分为两个子问题(小事化了)
  2. 对于子问题仍采用分治策略(大事化小)
  3. 将子问题的解合并成原问题的解(特别注意)

第一步、第二步是思维的问题,只要我们不陷入思维的漩涡,记住处理递归出口就没有问题,而第三步是细节问题,我们常常忽略,而且不易处理,下面举两个例子来加以说明。

求二维极大点问题。在二维空间中,如果x1>x2且y1>y2,那么称点(x1,y1)支配点(x2,y2)。在一个二维点集中,如果一个点没有被其它点支配,则称这个点是极大点。为了找出这个点集的所有极大点,可以采用分治策略,将点集划分成点数更少的两个点集,递归出口是:当点集只有一个点时,这个点就是这个点集的极大点。对于合并子问题的解的时候就要小心了,并不是简单地取它们的并集,而要考虑这两个点集的极大点之间是否存在支配与被支配的关系,处理的方法很简单:如果左子点集的极大点的y值小于右子点集中的某个极大点,则舍弃左子点集的该极大点。

最近点对问题:一个平面上有n个点,找出距离最近的那对点。采用分治策略,第一二步就不说了。当我们合并这个子点集的最近点对时需要注意:原点集的最近点对的两个端点可能在不同的子点集中,这就需要我们考虑,以分割线附近的点为圆心,以两子点集较小的点对的距离为半径画圆,判断圆内是否存在另个点集中的点,如果存在,最短距离将更改,如果没有,最短距离就是两子点集较小的点对的距离。

在大学老师告诫我们的两点,加上合并注意事项,就构成了采用分治策略应注意的三点:

  1. 思考如何将大问题分解成两个小问题
  2. 记住递归出口
  3. 处理合并解的问题

【技术文档】《算法设计与分析导论》R.C.T.Lee等·第4章 分治策略的更多相关文章

  1. 【技术文档】《算法设计与分析导论》R.C.T.Lee等·第7章 动态规划

    由于种种原因(看这一章间隔的时间太长,弄不清动态规划.分治.递归是什么关系),导致这章内容看了三遍才基本看懂动态规划是什么.动态规划适合解决可分阶段的组合优化问题,但它又不同于贪心算法,动态规划所解决 ...

  2. 【技术文档】《算法设计与分析导论》R.C.T.Lee等·第5章 树搜索策略

    计算机中许多问题的解空间可以用一棵树来表示,最优解就在树中的一个分支上,因此,我们在解这类问题时可以采用树搜索策略,最经典的问题包括0/1背包问题.旅行商问题.哈密顿回路问题,还有8数码问题(就是我们 ...

  3. Kafka 技术文档

    Kafka 技术文档   目录 1 Kafka创建背景 2 Kafka简介 3 Kafka好处 3.1 解耦 3.2 冗余 3.3 扩展性 3.4 灵活性 & 峰值处理能力 3.5 可恢复性 ...

  4. RabbitMq 技术文档

    RabbitMq 技术文档 目录 1 AMQP简介 2 AMQP的实现 3 RabbitMQ简介 3.1 概念说明 3.2 消息队列的使用过程 3.3 RabbitMQ的特性 4 RabbitMQ使用 ...

  5. 软件工程第4次作业------石墨文档Android客户端案例分析

    作业要求的博客链接:https://edu.cnblogs.com/campus/nenu/2016CS/homework/2505 分析产品:石墨文档Android客户端 第一部分 调研和评测 1. ...

  6. 如何写好技术文档——来自Google十多年的文档经验

    本文大部分内容翻译总结自<Software Engineering at Google> 第10章节 Documentation. 另外,该书电子版近日已经可以免费下载了 https:// ...

  7. Atitit usrQBK1600 技术文档的规范标准化解决方案

    Atitit usrQBK1600 技术文档的规范标准化解决方案 1.1. Keyword关键词..展关键词,横向拓展比较,纵向抽象细化拓展知识点1 1.2. 标题必须有高大上词汇,参考文章排行榜,1 ...

  8. [转]unity3d 脚本参考-技术文档

    unity3d 脚本参考-技术文档 核心提示:一.脚本概览这是一个关于Unity内部脚本如何工作的简单概览.Unity内部的脚本,是通过附加自定义脚本对象到游戏物体组成的.在脚本对象内部不同志的函数被 ...

  9. 程序员如何编写好开发技术文档 如何编写优质的API文档工作

    编写技术文档,是令众多开发者望而生畏的任务之一.它本身是一件费时费力才能做好的工作.可是大多数时候,人们却总是想抄抄捷径,这样做的结果往往非常令人遗憾的,因为优质的技术文档是决定你的项目是否引人关注的 ...

随机推荐

  1. SGU 121.Bridges painting

    原题地址 题意: 新百慕大由N个岛屿组成,在岛屿之间有一些连接它们的桥.在任意两个岛屿之间,最多只有一座桥连接它们.总统先生下达命令,要求给所有桥上色. 每一座桥能被染成 白色 或者 黑色. 每一个岛 ...

  2. 根据打开页面加载不同Js

    根据打开页面加载不同Js //根据打开页面加载不同JS $(document).ready(function(){ var href = document.URL; /*获取当前页面的URL*/ if ...

  3. php之框架增加日志记录功能类

    <?php /* 思路:给定文件,写入读取(fopen ,fwrite……) 如果大于1M 则重写备份 传给一个内容, 判断大小,如果大于1M,备份 小于则写入 */ class Log{ // ...

  4. JavaScript中document.cookie

    “某些 Web 站点在您的硬盘上用很小的文本文件存储了一些信息,这些文件就称为 Cookie.”—— MSIE 帮助.一般来说,Cookies 是 CGI 或类似,比 HTML 高级的文件.程序等创建 ...

  5. ps批量修改图片

    批量更改图片尺寸的ps脚本 高端干货!PHOTOSHOP实用脚本大合集

  6. 物联网传输协议MQTT

    MQTT是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务.MQTT是专门针对物联网开发的轻量级传输协议.MQTT协议针对低 ...

  7. SHell命令总结

    cat  files-to-copy.txt | xargs -i cp {} /tmp

  8. 通过 IDE 向 Storm 集群远程提交 topology

    转载: http://weyo.me/pages/techs/storm-topology-remote-submission/ http://www.javaworld.com/article/20 ...

  9. ios开发学习- 简易音乐播放器2 (基于iPhone4s屏幕尺寸)-- 歌词解析--plist文件应用--imageNamed图片加载耗内存

    声明:(部分图片来自网络,如果侵犯了您的权益请联系我,会尽快删除!) 又是音乐播放器,不过这次和上次不一样了,准确说这次更像播放器了,初学者不建议看这个,可以先看前面一个音乐播放器(1),当然 我没加 ...

  10. STM32F10x 学习笔记6(USART实现串口通讯 2)

    这次讲讲利用串口收发中断来进行串口通讯.STM32 上为每个串口分配了一个中断.也就是说无论是发送完成还是收到数据或是数据溢出都产生同一个中断.程序需在中断处理函数中读取状态寄存器(USART_SR) ...