五种常用的算法设计技巧之二:分治算法

一,介绍

分治算法主要包含两个步骤:分、治。分,就是递归地将原问题分解成小问题;治则是:在解决了各个小问题之后(各个击破之后)合并小问题的解,从而得到整个问题的解

二,分治递归表达式

分治算法一般都可以写出一个递归表达式;比如经典的归并排序的递归表达式:T(N)=2T(N/2)+O(N)

T(N)代表整个原问题,采用了分治解决方案后,它可以表示成:

①分解成了两个规模只有原来一半(N/2)的子问题:T(N/2)

②当解决完这两个子问题T(N/2)之后,再合并这两个子问题需要的代价是 O(N)

递归表达式的解就是该算法的时间复杂度。关于某些特定形式的递归表达式,求解时,是可以直接套公式的:

T(N)=aT(N/b)+Θ(N^K) 表示将原问题分解成 a 个 规模大小为 N/b 的子问题,合并这 a 个子问题的代价是 Θ(N^K)  (N^k 表示 N 的 k 次方)

T(N)的解有以下三种情况:

1) T(N)=O(N^logba)   当 a > bk

2) T(N)=O(Nk logN)   当 a = bk

3) T(N)=O(Nk)   当 a < bk

三,分治算法的一些实例分析

①最近点问题,参考《数据结构与算法分析》Mark Allen Wiess著 第10章

问题描述:在一个平面上分布着若干个点,点与点之间的距离公式为:[(x1-x2)2 + (y1-y2)2]1/2

找出,距离最小的那两个点

假设平面上有N个点,这N个点之间共有 1+2+3+……+(N-1) = N(N-1)/2 个距离,采用穷举,时间复杂度为O(N^2);而采用分治则可以做到O(NlogN)

那如何应用分治呢?

首先将N个点按照 X轴坐标进行排序,排序算法的时间复杂度为O(NlogN),故相对于穷举而言,它不影响总是时间复杂度。因为O(NlogN) << O(N^2)(远远小于)

按X轴坐标排序后,可以划一条垂直于X轴的线,将所有的点划分成两半。那么,点与点之间的距离就会出现三种情况:

a)两个点完全处于垂线的左边,那么这两点的距离不会越过垂线,这类距离记为 DL

b)两个点完全处于垂线的右边,那么这两点的距离不会越过垂线,这类距离记为 DR

c)两个点一个在垂线的左边,一个在垂线的右边,因此这两个的距离会横跨垂线

这种划分思想,在求解:最大子序列的和 时,也可以采用。

设 minD = min{DL,DR},即minD是 a)  和 b) 这两种情况下的所有距离中最小的那个距离。

那么,可以用数学证明:处于[-minD, minD]这个范围内的点平均只有 O(sqrt(N))个。

而sqrt(N)个点,一共有 O(N)个距离对,因为N个点一共有N(N-1)/2,即O(N^2)个距离对

这样,我们可以将处于 c) 中的点对距离 采用穷举来查找出最小的距离,复杂度为O(N)

而,处于a) 和 b) 中的点可以 继续进行递归划分。

从而,递归表达式为: T(N)=2T(N/2)+O(N) ,而这个表达式的解为:T(N)=O(NlogN)

也就是说,采用了分治,成功地将原问题从O(N^2) 降低为 O(NlogN)

四,参考资料

五种常用的算法设计技巧之五:回溯算法

五种常用的算法设计技巧之四:随机化算法

五种常用的算法设计技巧之三:动态规划

五种常用的算法设计技巧之一:贪心算法

时间: 2024-11-22 21:03:13

五种常用的算法设计技巧之二:分治算法的相关文章

PHP V5 的五种常用设计模式

设计模式 一书将设计模式引入软件社区,该书的作者是 Erich Gamma.Richard Helm.Ralph Johnson 和 John Vlissides Design(俗称 "四人帮").所介绍的设计模式背后的核心概念非常简单.经过多年的软件开发实践,Gamma 等人发现了某些具有固定设计的模式,就像建筑师设计房子和建筑物一样,可以为浴室的位置或厨房的构造方式开发模板.使用这些模板或者说设计模式 意味着可以更快地设计更好的建筑物.同样的概念也适用于软件. 设计模式不仅代表着更

《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——Alpha-Beta剪枝

2014.07.08 22:43 简介: “搜索”与“剪枝”几乎是如影随形的.此处的“搜索”指的是带有回溯算法的深度优先搜索. 在之前的“Minimax策略”中我们给出了一个三连棋的程序,运行后你就知道计算一步棋要花多少时间. 为了计算最优的一步棋,我们可能需要递归9万多次.如果毫无疑问这种阶乘式的穷举过程必须通过剪枝来加速. 本篇介绍一种用于Minimax策略的剪枝思路——α-β剪枝. 剪枝的英语是pruning,所以不要想当然说成trimming. 图示: 在上一篇讲解Minimax策略的博

五种常用的图片格式及其是否有数据压缩的总结

五种常用的图片格式及其是否有数据压缩的总结 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:本文主要介绍五种最常见和最常用的图像格式:BMP,PNG,JPEG,JPEG200,以及GIF.在进行图像处理相关应用之前第一步首先是能够读取这些图像文件,虽然很多开发工具支持库比如OpenCV等已经帮助节省了这些工作的麻烦,便利的同时也使得开发人员不再熟悉这些基本的图像格式.本文的作用就在于将这五种常用的图像格式进行分条叙述,方便查阅. 内容借鉴主流图片格

java线程池与五种常用线程池策略使用与解析

背景:面试中会要求对5中线程池作分析.所以要熟知线程池的运行细节,如CachedThreadPool会引发oom吗? java线程池与五种常用线程池策略使用与解析 可选择的阻塞队列BlockingQueue详解 首先看一下新任务进入时线程池的执行策略: 如果运行的线程少于corePoolSize,则 Executor始终首选添加新的线程,而不进行排队.(如果当前运行的线程小于corePoolSize,则任务根本不会存入queue中,而是直接运行) 如果运行的线程大于等于 corePoolSize

java线程池和五种常用线程池的策略使用与解析

java线程池和五种常用线程池策略使用与解析 一.线程池 关于为什么要使用线程池久不赘述了,首先看一下java中作为线程池Executor底层实现类的ThredPoolExecutor的构造函数 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory th

数据结构与算法分析(六)——算法设计技巧

从算法的实现向算法的设计转变,提供解决问题的思路 1.贪心算法 一种局部最优算法设计思路,思想是保证每一步选择在当前达到最优.一个很常见的贪心算法案例是零钱找取问题. 调度问题:书上的调度问题比较简单,其目标是所有作业的平均持续时间(调度+运行)最短,无论是但处理器还是多处理器,最优解的方案总是按作业的长短排序进行调度.<计算机算法设计与分析>上的作业调度的目标是最后完成时间最小,这要稍微复杂一些. 霍夫曼编码:最优编码必定保持满树的性质,基本问题在于找到总之最小的满二叉树.最简单的霍夫曼编码

几种常用App原型设计工具详解

摘要:用于App开发的原型设计工具已有很多,鱼龙混杂,这对有潜在选择恐惧症者来说可不是一件好事,今天大家就和小编一起深入认识一下几种常用的App原型设计工具. 大家都在用的Axure Axure RP,即Axure Rapid Prototyping是最常用的快速原型设计工具之一,帮助负责定义需求和规格.设计功能和界面的用户快速创建线框图.流程图.原型和规格说明文档,可用于应用软件和Web网站设计,支持多人协作设计和版本控制管理. Axure RP的用户群体非常宽泛,包括商业分析师.信息架构师.

五种常用的C/C++编译器对64位整型的支持

变量定义 输出方式 gcc(mingw32) g++(mingw32) gcc(linux i386) g++(linux i386) MicrosoftVisual C++ 6.0 long long "%lld" 错误 错误 正确 正确 无法编译 long long "%I64d" 正确 正确 错误 错误 无法编译 __int64 "%lld" 错误 错误 无法编译 无法编译 错误 __int64 "%I64d" 正确 正

【万字博文】分析与设计:插入排序和分治算法、递归和迭代的探讨

插入排序及其解决思路 算法的作用自然不用多说,无论是在校学生,还是已经工作多年,只要想在计算机这条道路走得更远,算法都是必不可少的. 就像编程语言中的"Hello World!"程序一般,学习算法一开始学的便是排序算法.排序问题在日常生活中也是很常见的,说得专业点: 输入是:n个数的一个序列<a1,a2,...,an?1,an> 输出是:这n个数的一个全新的序列<a,1,a,2,...,a,n?1,a,n>,其特征是a,1≤a,2≤...≤a,n?1≤a,n 举