分治算法初步
例:
最大子数组的差问题。
给定数组[13,-3,-25,20,-3,-16,-23, …],
求数组中连续的首尾差最大的子数组。
对于A[low, high),划分为A[low,mid), A[mid, high)
此时最大子数组只可能有三种情况:
完全位于A[low, mid)
完全位于A[mid, high)
横跨中点
我们可以递归求解
1 | def calculate_mid(A, low, high): |
** 以上代码并非计算最大子数组的和 **
算法导论提供另一种思路:
- 将每天相对于前一天的变化值记录下,作为新数组 – O(n)
- 计算最大子数组(即数组各元素和最大的子数组)
计算子数组的和 与 计算首尾差 对算法实现并无太大影响。
算法本质都是使用分治法。
- 将每天相对于前一天的变化值记录下,作为新数组 – O(n)
分治核心就是将大问题划分为多个小问题
如计算最大子数组就是将问题划分为三个板块
完全左半部分, 完全右半部分, 横跨中点。
其中前两者都是递归。后者可遍历直接得出答案。