type
status
date
slug
summary
tags
category
icon
password
WHY
在刷算法题的过程中,我们时常会遇到一类问题,它们表面上看起来规模很复杂,直接去解决很不容易,这个不容易可能是思路上面,也可能是时间复杂度过高,比如,对n个数进行排序,当n为1,直接得出结果,为2时,做一次比较,但当n比较大时,这个问题就就没那么好直接得出结果。解决的办法有很多,这里我们关注今天的主角:分治算法。
WHAT
分治算法,顾名思义,分而治之,将一个大问题分为几个小问题去解决,化繁为简。
具体而言,对于一个规模为n的问题,有两种处理逻辑:
1. 直接处理;
- 分为更小的子问题去解决;
当问题的规模小到让我们很容易处理时,我们采取1,否则采取2;
划分出来的子问题往往与原问题具有相同的形式,可以递归进行处理,然后对各个子问题的结果合并得到原问题的答案;
从递归的角度来看,相当于对原问题一次次用逻辑2进行递归向下处理,最后到达递归终止条件,也就是规模足够小,这时用逻辑1处理,返回结果,结果再一次次递归向上传递,最后得到原问题的答案。
极简流程图
适用情况
- 原问题必须能够分成更小的子问题;
- 这些子问题要与原问题有相同的问题形式;
- 子问题之间要相互独立。
经典问题
二分搜索
汉诺塔
棋盘覆盖
…
代码简析
整数划分问题
实际应用
哈夫曼编码
各类搜索算法等
- 作者:Alex
- 链接:https://nextme.one/wureny.eth/article/fenzhi
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章