介绍
分治法是计算机科学中很重要的一种思想。英文为divide and conquer,直译即为分治,或者分而治之。直观的理解就是将一个大而难的问题分解为一些小而易的问题,先解决这些易于解决的小问题,再合并这些小问题的解(合并可以是分别求出小问题的解再合并,或者是直接将相同的小问题合并只求解一次),从而得到大问题的解。需要注意的是小问题必须和大问题是同一个类型的问题,或者说解法相同,这样才可以递归求解。我们发现,这种实际上是自顶向下地分解问题。
我们可以说分治思想是被极广泛运用的思想。
很多算法和数据结构采用了这种思想。另外计算机图像渲染将像素点分配给gpu内的多个流处理器分别处理,最后合成出一帧的图像;也会将一个矩阵乘法分解成n个部分分配给n个处理器并行处理。
下面介绍一些采用了分治思想的算法和数据结构。
算法
快速排序
数列每次按小于某个数(可能是数列的首尾元素或者是随机选择或者是三值取中法等)的和大于某个数的标准划分为两个子序列,但子序列内的顺序和在原数列内的顺序一样,时间复杂度期望nlogn
归并排序
将数列从中间切成两半,分别递归解决两半的排序问题,再合并解,即合并两个有序数列,由于每次合并需要花费o(n)的时间,因此时间复杂度为o(nlogn)。
为了能更好地理解分治的思想,我们详细介绍一下归并排序。
比如我们定义mergesort(array: list, from: int, to: int)为归并排序函数,那么我们可以这么写:
join(a: list, b) =if(either a or b is empty) b or aelseif(a[1] [2,2] in [1,2] & [3,3] in [3,4] -> [2,2] in [2,2] & [3,3] in [3,4]
也就是我们将这个区间按照适当的方式(按照已有的划分方法)划分成2个子区间(或者正好不需要划分,继续往下走),得到2个子区间(子问题)的和,再加起来,得到当前区间(大问题)的和。我们很容易知道,这么做的时间复杂度是均摊logn的。
对半划分子问题的优势我们在将归并排序的时候已经讲过了,这里的理由类似。但是像b树等就不是对半划分的。
- 伸展树
数列每次从某个点切割,某个点可以代表一个区间
- 划分树
数列每次按较小的一半和较大的一般切割
- 树状数组
和线段树类似
- ……
一些题目
以下题目分类仅供参考。。
分治 poj
2083
bzoj
1095, 2001, 2229, 2287, 2458, 2229, 3614, 3658, 3879, 4025, 4059
codeforces
321e, 576e
树分治 poj
1741, 1987, 2114,
bzoj
1095, 1468, 1758, 2152, 2599, 3365, 3435, 3648, 3672, 3697, 3784, 3924, 4012, 4016, 4372
hdu
4812
cdq分治 bzoj
1176, 1492, 1537, 2244, 2683, 2716, 2961, 3262, 3295
总结
我们先介绍了分治法是怎么样的一种思想,并介绍了一些典型(常见)的运用了分治思想的算法和数据结构。我们了解了分治法是如何自顶向下的。实际上现实生活中我们也能见到分治法的运用。我们写一个策划,会将策划的不同环节交给不同的人做,最后总策划再将各个人做好的各个部分的策划修改并整合成最终的总策划。而每个写子策划的人又可能将任务继续下派分发给部门内部多个人员共同完成。可以说,计算机科学中的分治法源于生活。如此重要的思想,我们一定要理解。
制作一个具有信号增益增强选项的200wHiFi单声道放大器
你不知道的Linux有名管道(FIFO)的阻塞和非阻塞读写
高空测报灯的应用场景及其使用效果的详细讲解
iPhone 8将改名iPhone X?iPhone8将配备5.8寸OLED显示屏?
为什么LED内不集成限流电阻呢?
自顶向下和逐步求精
如何实现STM32F407单片机的ADC转换
使用联合学习桥接金融服务中的数据孤岛
智能余压报警系统是否需要与其他防火设备和建筑智能化系统集成?
最新48Gbps的HDMI连接线缆即将上市
国星光电获评“佛山市育才引才标杆企业”荣誉称号
DJI会陆续变更部分产品制式,可通过更新固件实现FCC制式变更
Gartner 2019曲线5大趋势:“超能人类”将出现,自动机器人普及
Aldec公司推出HES-HPC-DSP-KU115 FPGA加速板卡
新思科技采用VCS 与 Verdi 结合,推出与众不同的芯片设计
上汽通用五菱全球小型纯电动车销量突破 30 万辆
如何组装无线PS2遥控器4WD机器人车载套件
北京启动首个AI产业方向创新应用平台
爱国者EROSK评测 在HIFI音质和实用性上的表现都不错
数字化转型及其通过能量收集在物联网可持续性中的作用