最近在学习算法,看了MOOC上北航童咏昕老师的课后收获很多,这篇文章算是我的学习笔记。
什么是分治法?
这个问题其实很好回答,就是将一个大问题拆解成很多个小问题,依次解决每个小问题,最后整理结果合并为大问题的答案,兵法中这叫逐个击破。
哪些时候适合用分治法?
以分治法的三个步骤为思路,首先这个问题要能被拆解,这点大部分问题都满足,因为问题的复杂性往往和问题的规模正相关。其次是能被拆解为若干个相同的子问题,即具有最优子结构性质。最后也是分治法最关键的特点,即每个子问题的解最终能合并为大问题的解。
分治法框架
- 分解原问题
- 解决子问题
- 合并问题解
典型案例——归并排序

首先是分解:
function mergeSort(arr) {
let len = arr.length
if (len < 2) return arr
let mid = Math.floor(len/2)
let left=arr.slice(0,mid)
let right=arr.slice(mid)
return merge(mergeSort(left),mergeSort(right))
}

本文介绍了分治法的概念、适用场景和框架,并通过归并排序和求最大子数组和的案例深入讲解了分治法的应用。归并排序中,数组被递归分解,子数组有序合并;最大子数组和问题中,分治法需考虑子问题间的交叉,通过maxCrossSubArray()函数处理。分治法虽简单,但实际应用时需注意细节,尤其子问题相关时的合并设计。
最低0.47元/天 解锁文章
1305

被折叠的 条评论
为什么被折叠?



