1、如果问题和以下数据结构相关,那么把他们分成子问题相对容易

  • n维数组
  • 矩阵
  • n个元素的集合
  • 有向无环图
  • 通用图

2、分治算法一般应用于可以分成子问题的问题

实例:

一、排序问题:对一个n维数组排序

输入:一个n维整数数组,A[0..n-1]
输出:递增排序的A

插入排序:

时间复杂度:

归并排序:

时间复杂度:

比较两种方法,插入排序和归并排序,从n*n到n*logn节省了哪些环节呢?如下图

虚线的部分即是省略的部分

此外还有个定律:

二、计算n维数组中的逆序对

输入:n个数a1,a2,...an
输出:逆序对个数,如:i<j但是ai>aj

暴力破解:

检查每一对(ai,aj),时间复杂度:O(n*n),我们有没有更好的方法呢?

直接分治:

时间复杂度:

分治并排序:

就是在归并排序中加了一行,这里n是指||L||+||R||

分治程序包括三个步骤:

  • 把问题分成一些子问题,如何分:中间点;通过奇偶分;随机分
  • 通过递归来求解子问题
  • 将子问题的解合并为原问题的解

快速排序:通过随机的点来划分

但是这种方法最好情况和平均情况下有O(n*logn),最坏情况下有O(n*n),我们能否进一步优化呢?

我们可以不找最中心的点(best pivot),我们可以找接近中心的点(good pivots)

选择接近中心的点是容易的:

P(选择中心点)=1/n

P(选择接近中心的点)=1/2

代码:

计算可得

即只需要约两次就可以找到good pivots

计算时间复杂度:

树的深度为,每一层合并操作为

所以

三、在数组中选择第k小的数

输入:一个数组A=[A0,A1,...,An-1]
输出:第k小的数或者A的中位数

考虑直接排序然后取出第k小的数,时间复杂度为O(n*logn),我们能不能改进这个算法呢?

考虑分治

计算复杂度:

最坏:每次选择的都是最小的或者是最大的元素

最好:每次都选择最中心的元素

好:每次选择接近中心的元素,如:,比如设,在这种情况下,子问题的规模也呈指数级下降。

所以,选择好的pivot很重要,那么如何选择接近中心的pivots呢?

下面介绍三种算法,分别从不同的角度:

  • 通过从中位数中选择pivot:BFPRT算法
  • 通过随机选择一个元素来选择pivot:QuickSelect算法
  • 通过随机采样选择pivots:FLOYD-RIVEST算法

BFPRT算法:在分组的中位数中取中位数

解释:

1、分组,一组5个元素

2、找出每个组的中位元素,有5/n个组,每组最多6步找出中位数(排序),时间复杂度为6n/5

3、通过递归找medians中的中位数(M)

4、通过M把A分成S-和S+,时间复杂度为O(n)

8、有n/5个组,所以有n/10个组在32左边,对于每个组有至少3个小于32,那么有所以有,

10、有n/5个组,所以有n/10个组在32右边,对于每个组有至少3个大于32,那么有所以有,

总时间复杂度计算:

具体代码:

后续我会补上

QuickSelect算法:随机选择一个元素作为pivot

代码:

一个例子:

  • 选择一个接近中心的pivot将会导致很大的规模下降(上面的例子是降为原先的3/4)
  • 选择一个接近中心的pivot大约需要两次迭代(上面已经证明期望为2)

可以证明这个算法的复杂度为O(n)

证明:

  • 把问题按规模分期,如,即为0期,为1期
  • X来表示算法用了多少次的比较,每一期j的比较次数为Xj,X=X0+X1+...,我们想求它的期望
  • 对于任意的j期,要找到绿色区域作为pivot的概率为1/2,一旦选择这种pivot,那么规模就变成原来的3/4,并且进入下一期,每一期里期望的迭代次数是2。
  • 第j期里最多有多少次比较呢?首先看第0期最多有cn次比较,那么第j期就最多有次比较,因此,
  • 因此,

FLOYD-RIVEST算法,选择一个pivot基于一个随机的采样

样本是总体的无偏估计

算法:

1、随机有放回的采样,选择r个元素, 把样本设为S。

2、控制S比较小,让u为处的S的元素,v为处的S的元素。

3、把A分成三个部分,L,M,H。L比u小,H比v大,M在中间。

4、检测M是否符合条件,可确保M中有中位数。

5、找到中位数

这里我们要精心设计,使M足够大到把中位数包含进去,又要使M足够小,时间复杂度够低(因为最后要对M排序)。

我们可以设,所以M有大小

所以时间复杂度分析:

总时间复杂度为:,已经非常的高效。

四、给定平面上的一组点,选择最近的一组点

输入:平面上的n组点
输出:距离最小的一组点

1、把平面通过x分为2个大致相等的子集

2、在每一半中找到最接近的点对

3、再考虑一个在左边一个在右边的最近的点对

需要时间复杂度为O(n*n),能否再改进它呢?

其实,第三步只出现在一个窄的条带中

因此,我们把这个窄条带分成一个个网格,大小为为两边最小距离中小的那个。

这样对于任何一个点,最多只用选择11个点和它算距离。

最坏情况下,每个网格中都有一个点

那么对于绿色的点,只需要算右边6个红色的点。

我们可以把所有点按照y排序,其实我们只用计算与绿色点相邻的11个点,因为红色的6个点一定是包含在这11个点里。

代码及其时间复杂度:

这个时间复杂度,我们还可以再改进,这里我们需要引入结构

在第7步中,我们在递归中把两部分排好序。在第8步中,两部分就像MergeSort那样合并,只用花费O(n)的时间,这样时间复杂度就变为

计算机算法设计与分析二--分治相关推荐

  1. 计算机算法设计与分析教学大纲,《算法设计与分析》教学大纲

    <<算法设计与分析>教学大纲>由会员分享,可在线阅读,更多相关<<算法设计与分析>教学大纲(3页珍藏版)>请在人人文库网上搜索. 1.课程编号:&quo ...

  2. 算法设计与分析:分治思想 - 入门

    文章目录 分治思想 判断分治的条件 分治思想在排序问题的应用 求逆序对的个数 分治总结 本文参考UCAS卜东波老师的计算机算法设计与分析课程完成 分治思想 分治思想可以归纳为两点: 将一个复杂问题化简 ...

  3. 计算机算法设计与分析(第4版) 王晓东 著 2012.2 笔记(这本书还不错,偏实用、有难度)

    计算机算法设计与分析(第4版) 目录 1 算法概述 2 递归与分治策略 3 动态规划 4 贪心算法 5 回溯法 6 分支限界法 7 随机化算法 8 线性规划与网络流 算法概述 复杂性分析 NP-完全性 ...

  4. 计算机算法设计与分析考试题,《计算机算法设计与分析》习题及答案

    <计算机算法设计与分析>习题及答案 一.选择题 1.二分搜索算法是利用( A )实现的算法. A.分治策略 B.动态规划法 C.贪心法 D.回溯法 2.下列不是动态规划算法基本步骤的是( ...

  5. 国科大刘玉贵老师计算机算法设计与分析2021年期末考试题回顾

    总体感受 国科大研究生的计算机算法设计与分析课程有三位老师教授,分别是卜东波老师.陈玉福老师 和刘玉贵老师,这三位老师上课各有特色和风格.我选择的是刘玉贵老师的课程. 这门课程的内容挺充足的,但是有个 ...

  6. 计算机算法设计与分析(第5版)PDF

    <计算机算法设计与分析(第5版)>是2018年电子工业出版社出版的图书,作者是王晓东. 整本书的结构是:先介绍算法设计策略思想,然后从解决经典算法问题来学习,通过实践的方式去学习算法. 网 ...

  7. 计算机算法设计与分析第四版复习,计算机算法设计与分析(第4版)第1章.ppt

    <计算机算法设计与分析(第4版)第1章.ppt>由会员分享,可在线阅读,更多相关<计算机算法设计与分析(第4版)第1章.ppt(50页珍藏版)>请在人人文库网上搜索. 1.计算 ...

  8. 计算机英语 刘阳,英语ⅰ计算机算法设计与分析.pdf

    英语ⅰ计算机算法设计与分析 英语Ⅰ 编号: 属性:必修课 学时/学分:60/3 教学方式:本课程以课堂讲授和课下作业相结合.根据工程硕士英语教学大纲的要求及在职 研究生的教学实际状况及特点,课堂讲授和 ...

  9. 计算机算法设计与分析 动态规划 实验报告,动态规划法解最长公共子序列(计算机算法设计与分析实验报告).doc...

    动态规划法解最长公共子序列(计算机算法设计与分析实验报告) 实报 告 实验名称:任课教师::姓 名:完成日期:二.主要实验内容及要求: 要求按动态规划法原理求解问题: 要求交互输入两个序列数据: 要求 ...

最新文章

  1. ValueError: Masked arrays must be 1-D
  2. 【uiautomator】UiDevice
  3. python爬虫机器_Python常用的机器学习库|python爬虫|python入门|python教程
  4. 小米10官宣首发骁龙865,小米6“钉子户”可以考虑换机了
  5. ssis for循环容器_SSIS Foreach循环与For循环容器
  6. 答应我,安装chromedriver,按照版本号,v70就安装v2.42,
  7. ThinkPhp学习01
  8. 1001 害死人不偿命的(3n+1)猜想 (15)
  9. mysql 写入性能_MySQL存储写入性能严重抖动分析
  10. 乐优商城项目实战系列2
  11. 一文7个步骤教你搭建测试web测试项目实战环境,
  12. java开发系统架构_Java开发:ECP系统J2EE架构开发平台
  13. 计算机网络笔记(一):网络基本构成
  14. 瑞晟蓝牙来电语音软件下载_语音导出app手机最新版-语音导出app安卓免费版下载v8.3-领航下载站...
  15. matplotlib画图使用微软雅黑字体
  16. cntv客户端_cntv网络电视_cntv官方下载-太平洋下载中心
  17. BZOJ5336:[TJOI2018]游园会——题解
  18. 【NiosII训练】第二篇、FPGA驱动AD9854高级篇
  19. html文字旋转以后变形,CSS3中的变形处理——transform功能(旋转、缩放、倾斜、移动)...
  20. 雷军内部信:米家有品拆分 做独立电商

热门文章

  1. python 科学计算基础教程电子版-自学Python 编程基础、科学计算及数据分析
  2. python3.5.0下载-Python for Linux
  3. python贴吧发帖脚本-Python实现自动添加脚本头信息的示例代码
  4. 自学python清单-我的2018学习清单
  5. python课程设计报告总结-上海python课程设计报告目的
  6. python学多久可以接单-零基础小白多久能学会python
  7. java和python哪个好就业2020-Java和Python哪个发展前景好?老男孩教育
  8. yolov5 v3.0训练报错: torch.nn.modules.module.ModuleAttributeError: ‘BatchNorm2d‘ object has no attribute
  9. JSR338(Java Persistence)
  10. UVa1450 Airport(二分法)