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

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

  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. Win7系统下完全删除Mysql

    今天不知为什么Mysql服务器突然连接不上,于是胡乱折腾了一番,导致最后不得不重新安装Mysql.安装不成功,服务器起不来,就是最后那步的时候服务器启动不了,这是因为Mysql在卸载的时候没有彻底卸载 ...

  2. 实用的透明背景mark图标

  3. sphinx(coreseek)——1、增量索引

    首先介绍一下     CoreSeek/Sphinx的发布包 indexer: 用于创建全文索引;    search: 一个简单的命令行(CLI) 的测试程序,用于测试全文索引;    search ...

  4. Python爬虫常用模块,BeautifulSoup笔记

    import urllib import urllib.request as request import re from bs4 import * #url = 'http://zh.house.q ...

  5. JS Math.sin() 与 Math.cos() 用法

    Math.sin(x)      x 的正玄值.返回值在 -1.0 到 1.0 之间: Math.cos(x)    x 的余弦值.返回的是 -1.0 到 1.0 之间的数: 这两个函数中的X 都是指 ...

  6. centos下Elasticsearch数据迁移与备份

    ########### ### 共享创建es官方网站就一句话 ########   1.下载 文件共享 .. rpm -i http://mirror.symnds.com/distributions ...

  7. js的引用顺序

    注意:Bootstrap中的JS插件依赖于JQuery,因此JQuery要在Bootstrap之前引用!!! 把JS文件引用放入body的最下面,是为了使js在网页全部加载完后才起作用,比如你的js里 ...

  8. adb设备,根据serial获取vid pid

    使用adb devices命令,可以轻松获取到所有连接到PC的adb设备的serial值. 但是adb命令无法获取adb usb设备的vendor id和product id. 本程序根据adb协议, ...

  9. jQuery取CSS的HEX(16位)颜色值

    //IE10以上版本.CHROME.FIREFOX中GRB颜色转HEX颜色值 $.fn.getBackgroundColor = function() { var rgb = $(this).css( ...

  10. H3C S5500上层接路由,VLAN IP作网站配置实例

    # version 5.20, Release 2208 # sysname S5500-1 # clock timezone #Web#8#01 add 08:00:00 # super passw ...