什么时候考虑使用分治算法

分治法是一个广泛的概念
// 往往是在merge阶段搞名堂,真正解决问题。



1 耗时少又能解决问题的merge

1.1 最大子数组问题

原本需要n^2时间,而发现跨越中点的(确定了中间一点的)最大子数组可以在O(n)时间内解决,
于是分治:T(n) = 2T(n/2) + O(n)
=> O(nlgn)

1.2 最近点对问题(二维欧几里得距离)

原本需要两两遍历一遍O(n^2),而发现跨域中线的点对可以在O(n)时间内解决,
于是分治:T(n) = 2T(n/2) + O(n)
=> O(nlgn)

1.3 找数组中数量过半的那个元素,不存在序关系,只能比较是否相同

该数组平均分为两部分,则主元素为两部分中至少一部分的主元素,故而:
递归地查找两部分P1, P2的主元素m1, m2,若
m1和m2相同,则即为主元素;
m1和m2不同,则主元素必为m1, m2中的一个,O(n)遍历一遍P1, P2就可以找出;
T(n) = 2T(n/2) + O(n)
对于这个问题,选用分治法是因为:
1.在merge阶段,可以巧妙地用O(n)实现,而非直接处理所需的O(n^2);
2.化分出的微小子问题可以轻易的解决。
仍需指出,存在着比分治更快的算法,在O(n)时间内两两遍历每个元素,若两个元素不同,则删去它们,这样不影响剩余部分的主元素。

2 简化重复计算

2.1 大整数乘法

通过观察,简化了需要重复计算的部分
大整数乘法
T(n) = 4T(n/2) + O(n)
=> T(n) = 3T(n/2) + O(n)

2.2 矩阵乘法的Strassen乘法

矩阵四等分后乘法直接计算不会比朴素算法快,而在细分发现了重复计算的部分,于是可以省略

2.3 快速幂

在计算幂次乘法的过程中发现了需要重复计算的部分,于是可以简化计算;
本质上,是把较高次幂的运算化分为较低次幂的计算,细分出来的较低次幂容易快速计算,再把它merge起来,分治思想是这样体现的。

发布了8 篇原创文章 · 获赞 2 · 访问量 171

猜你喜欢

转载自blog.csdn.net/ZhifanSk/article/details/104915768