分治法算法学习(一)——归并排序、求最大子数组和

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

最近在学习算法,看了MOOC上北航童咏昕老师的课后收获很多,这篇文章算是我的学习笔记。

什么是分治法?

这个问题其实很好回答,就是将一个大问题拆解成很多个小问题,依次解决每个小问题,最后整理结果合并为大问题的答案,兵法中这叫逐个击破。

哪些时候适合用分治法?

以分治法的三个步骤为思路,首先这个问题要能被拆解,这点大部分问题都满足,因为问题的复杂性往往和问题的规模正相关。其次是能被拆解为若干个相同的子问题,即具有最优子结构性质。最后也是分治法最关键的特点,即每个子问题的解最终能合并为大问题的解。

分治法框架

  1. 分解原问题
  2. 解决子问题
  3. 合并问题解

典型案例——归并排序


首先是分解:

  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))
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值