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

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

  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. Proxy 模式

    在以下集中情况下可以用 Proxy模式解决问题: 1)创建开销大的对象时候,比如显示一幅大的图片,我们将这个创建的过程交给代理去完成,GoF 称之为虚代理(Virtual Proxy): 2)为网络上 ...

  2. 如何为jquery添加方法

    以下内容引自一位网友的帖子: jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery ...

  3. php之文件上传简单介绍

    要声明的form表单格式 <form action="act.php" method="post" enctype="multipart/for ...

  4. 面试小结(java基础)

    一个.java源文件中可以有多个类吗?(内部类除外)有什么条件?带着这个疑惑,动手建几个测试类, 揭开心中的疑惑.以下是解开疑惑过程: package test;/** * 一个.java源文件中可以 ...

  5. int*-------int

    a=(int)((int*)0 + 4)求a是多少 大家看图应该明白了  十六进制0x00000010转换为十进制就是16

  6. WCF返回JSON的详细配置

    开发环境:VS2008,c# 1.新建个WCF服务网站 文件-新建-网站-WCF服务 2,运行一下,提示配置WEB.CONFIG,点击确认. 3,打开web.config增加如下节点: <ser ...

  7. 【算法】简单选择排序 O(n^2) 不稳定的 C语言

    简单选择排序 一.算法描述 假设序列中有N个元素: 第1趟找到第1到N个元素之间最小的一个,与第1个元素进行交换 第2趟找到第2到N个元素之间最小的一个,与第2个元素进行交换 第3趟找到第3到N个元素 ...

  8. github克隆项目中的子模块submodule时遇到的问题

    GitHub真是个开源大宝库,不只能学习代码,还能学习git的使用! 最近在研究Off-the-Record-iOS项目(https://github.com/chrisballinger/Off-t ...

  9. TortoiseSVN 的分支合并操作

    今天对svn的分支合并有了兴趣,所以对新建了一个项目练练手. 在网上找了一篇文章做指导: http://www.open-open.com/lib/view/open1346982569725.htm ...

  10. db2数据库中查找数据库表

    模糊查找db2数据库中的数据库表: select tabname,remarks from syscat.tables where TABNAME like  'DM%' select 'DROP T ...