实际场景中,我们之所以觉得有些问题很难解决,主要原因是该问题涉及到大量的数据,如果只需要处理少量的数据,问题会变得非常容易解决。

举一个简单的例子,设计一个排序算法实现对 1000 个整数进行排序。对于很多刚刚接触算法的初学者来说,直接实现对 1000 个整数进行排序是非常困难的。而同样的问题,如果转换成对 2 个整数进行排序,解决起来就很容易。

分治算法中,“分治”即“分而治之”的意思。分治算法解决问题的思路是:先将整个问题拆分成多个相互独立且数据量更少的小问题,通过逐一解决这些简单的小问题,最终找到解决整个问题的方案。
所谓问题间相互独立,简单理解就是每个问题都可以单独处理,不存在“谁先处理,谁后处理”的次序问题。

如图 1 所示,分治算法解决问题的过程需要经历 3 个阶段,分别是:
分:将整个问题划分成多个相对独立、涉及数据量更少的小问题,有些小问题还可以划分成很多更小的问题,直至每个问题都不可再分;
治:逐个解决所有的小问题;

合并:将所有小问题的解决方案合并到一起,找到解决整个问题的方案。

分治算法的利弊

使用分治算法解决的问题都具备这样的特征,当需要处理的数据量很少时,问题很容易就能解决,随着数据量增多,问题的解决难度也随之增大。分治算法通过将问题“分而治之”,每个小问题只需要处理少量的数据,每个小问题都很容易解决,最终就可以解决整个问题。

分治算法中,“分而治之”的小问题之间是相互独立的,处理次序不分先后,因此可以采用“并行”的方式让计算机同时处理多个小问题,提高问题的解决效率。

分治算法的弊端也很明显,该算法经常和递归算法搭配使用,整个解决问题的过程会耗费较多的时间和内存空间,严重时还可能导致程序运行崩溃。

分治算法的应用场景

分治算法解决的经典问题有很多,包括汉诺塔问题、寻找数列中最大值和最小值的问题等等。

分治算法还和其它算法搭配使用,比如二分查找算法、归并排序算法、快速排序算法等,后续章节会给大家一一进行讲解。

来到例题。

问题 Q: 【一本通基础分治】河中跳房子

[题目描述]

每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一个岩石跳到另一个岩石。这项激动人心的活动在一条长长的笔直河道中进行,在起点和离起点L远 (1 ≤ L≤ 1,000,000,000) 的终点处均有一个岩石。在起点和终点之间,有N (0 ≤ N ≤ 50,000) 个岩石,每个岩石与起点的距离分别为Di (0 < Di < L)。

在比赛过程中,奶牛轮流从起点出发,尝试到达终点,每一步只能从一个岩石跳到另一个岩石。当然,实力不济的奶牛是没有办法完成目标的。

农夫约翰为他的奶牛们感到自豪并且年年都观看了这项比赛。但随着时间的推移,看着其他农夫的胆小奶牛们在相距很近的岩石之间缓慢前行,他感到非常厌烦。他计划移走一些岩石,使得从起点到终点的过程中,最短的跳跃距离最长。他可以移走除起点和终点外的至多M (0 ≤ M ≤ N) 个岩石。

请帮助约翰确定移走这些岩石后,最长可能的最短跳跃距离是多少?

输入

第一行包含三个整数L, N, M,相邻两个整数之间用单个空格隔开。

接下来N行,每行一个整数,表示每个岩石与起点的距离。岩石按与起点距离从近到远给出,且不会有两个岩石出现在同一个位置。

输出

一个整数,最长可能的最短跳跃距离。

样例输入

25 5 2
2
11
14
17
21

样例输出

4

好不多说,直接上代码:

#include <bits/stdc++.h>
using namespace std;
int w, m, n, a[50005], l = 1, r, mid, s;
int main()
{cin >> w >> n >> m;for(int i = 1; i <= n; i++)scanf("%d", &a[i]);n++;a[n] = w; r = w;while(l <= r){mid = (l + r) / 2;s = 0;for(int i = 1; i <= n; i++){int q = a[i - 1];while(a[i] - q < mid){s++;i++;}}if(s > m) r = mid - 1;else l = mid + 1;}cout << r << endl;return 0;
}

分治算法详解(带图)相关推荐

  1. 分治算法详解(超详细)

    原 分治算法详解 分类专栏: 算法详解 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 原文链接: https://blog.csdn.net/effective_coder/a ...

  2. 分治算法 --- 详解

    ❤️❤️❤️感谢各位朋友接下来的阅读❤️❤️❤️ 分治算法概念: 分治算法,即分而治之: 在计算机科学中,分治法是一种很重要的算法.分治算法,字面上的解释是"分而治之",分治算法主 ...

  3. 分治算法详解:分而治之

    分治算法核心思想 分治算法用四个字概括就是分而治之. 将原问题划分成多个小规模并且简单的子问题,这些子问题的结构与原问题相似,因此,递归地解决这些子问题,将子问题的解合并就可以得到原问题的解了. 分治 ...

  4. 五大常用算法——分治算法详解及经典例题

    一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子 ...

  5. css动画(详解带图)

    css动画 过渡 过渡 (transition)的作用 常用属性 实例 动画 动画的简介 设置关键帧 动画常用属性 实例 变形 变形(transform)的简介 常用属性(transform) Z轴平 ...

  6. Apollo6.0代码Lattice算法详解——Part4:计算障碍物ST/SL图

    Apollo6.0代码Lattice算法详解--Part4:计算障碍物ST/SL图 0.前置知识 1.涉及主要函数 2.函数关系 3.部分函数代码详解 3.1 lattice_planner.cc中代 ...

  7. 机器学习,深度学习基础算法原理详解(图的搜索、交叉验证、PAC框架、VC-维(持续更新))

    机器学习,深度学习基础算法原理详解(图的搜索.交叉验证.PAC框架.VC-维.支持向量机.核方法(持续更新)) 机器学习,深度学习基础算法原理详解(数据结构部分(持续更新)) 文章目录 1. 图的搜索 ...

  8. 排序算法,最全的10大排序算法详解(Sort Algorithm)

    文章目录 排序算法,最全的10大排序算法详解(Sort Algorithm) 排序算法分类 排序算法稳定性 时间复杂度(time complexity) 1#时间复杂度的意义 2#基本操作执行次数 如 ...

  9. 图论-最短路Dijkstra算法详解超详 有图解

    整体来看dij就是从起点开始扩散致整个图的过程,为什么说他稳定呢,是因为他每次迭代,都能得到至少一个结点的最短路.(不像SPFA,玄学复杂度) 但是他的缺点就是不能处理带负权值的边,和代码量稍稍复杂. ...

最新文章

  1. java实现随机字母数字验证码
  2. click和blur 冲突???
  3. 看google三篇论文的感触
  4. sparkcore写mysql_spark读写mysql
  5. 80端口被system(pid=4)占用的解决方法
  6. navicat下载安装和激活一分钟完成
  7. __try,__except,__finally,__leave
  8. srgan要训练多久_SRGAN-超分辨率图像复原
  9. SQLServer 2008 r2 下载地址(百度云)及安装图解
  10. SQLMAP安装及详解
  11. vue设置video图片_vue video和vue-video-player实现视频铺满教程
  12. 信创操作系统--统信UOS桌面版(多媒体软件:图像查看、处理,音频播放、录音机)
  13. 数学知识都是计算机,数学在计算机的作用
  14. h5跳转app指定页面及各种坑的总结
  15. 常见而又容易被中小企业忽视的六个网络安全漏洞
  16. 曼尼托巴大学计算机科学世界排名,曼尼托巴大学世界排名多少
  17. 美国国防部“轻便安全盘”可否民用?
  18. 專注於目標,自然朝成功邁進
  19. 关于msn登陆不上去了的解决方法
  20. Windows7安装SQLServer2012详细亲测教程

热门文章

  1. win7(windows7旗舰版)声卡High Definition Audio驱动(安装失败)解决方案(Thinkpad)
  2. Struts2 拦截器技术笔记
  3. 手把手教你们Python配置OpenCV环境,小白看一遍就会了☀️《❤️记得收藏❤️》
  4. “数据中台、读写分离、表分区”解决MySQL 单表数据量、并放量双高的效率瓶颈
  5. 【重磅干货】俸旻老师:你所不知道的的量化交易?
  6. tornado框架图片上传和展示
  7. JMockit 使用指南
  8. 关于Http协议的知识总结
  9. oracle ORA-00911:无效字符
  10. LeetCode 赎金信