Skip to content

Lecture 7|Divide and Conquer

:material-circle-edit-outline: 约 506 个字 :material-clock-time-two-outline: 预计阅读时间 2 分钟

分治法

什么是分治法

递归地分解问题为子问题,递归地解决子子问题,递归地合并问题

image-20240409104757802

T(N)为解决规模为N的问题的开销

分为了a个子问题,每个子问题规模为N/b

合并的开销为f(N)

渐进上界

关键在于f(N),下面给出f(N)=Nf(N)=N^2的例子

image-20240409111154664

Closest Points Problem

平面上有N个点,请找出直线距离最小的两个点

image-20240409110847198

简单地分治会错过红线情况,而这恰恰是正解

于是我们在子问题中加入检测不同子问题里面的点集合间的情况

但是直接检测本质上和遍历没区别,我们就进行剪枝

例如先找到子问题里的最优解,然后检测每一个点到分界线的垂直距离,如果这都比最优解长,以后都不用考虑这个点了

\(\delta\) 是目前两个子问题的最优解

image-20240409111750135

image-20240409111805234

进一步优化,不仅考虑横轴,还考虑纵轴距离范围,对于纳入考虑的点,看下与另一点的纵向距离是否大于\(\delta\)

而且只需要从上往下即可,因为上面的矩阵里的点已经被测试过了

就是矩阵高是\(\delta\)而不是\(2\delta\),测试中的点在左上角的顶点而非中线处

image-20240409111910729

课后实现一下这个算法,比较困难

技巧是维护两个队列

image-20240409111926903

这样只需要检测一个个矩阵里的点即可

下面是最坏情况,即矩阵里点最多的情况

image-20240409112519841

中间黑白的意思是两个点重叠在一起

Methods for solving recurrences

需要重看PPT

image-20240409113136538

代入法

瞎猜法

猜出上界,归纳法证明

技巧:

image-20240409113327476

image-20240409113345590

image-20240409113430248

这里意思是不能从\(T<cN+N\)证明出\(T<cN\),,前者更松,后者更紧

递归树法

边画边猜法

image-20240409113735233

image-20240409113825418

主方法

求偶法

image-20240409113937447

第一个就是叶子特别多时,就只看叶子

第 个是根特别大,就只看根