前言
不知道为什么这段时间特别怠惰,怀疑是可能没有弄清楚努力的方向,对很多事情处于消极逃避的状态,不能直面困难解决他,这样的生活过的特别累。。。提不起劲。
分治算法
分治算法即分而治之,就是把一个复杂的问题分解成两个或多个相同或相似的子问题,再把子问题分解成更小的问题。。。直到最后子问题可以简单地直接求解,原问题即子问题的合并。分治算法主要分为三个步骤:
- 分解:将问题划分成一系列子问题,子问题的形式和原问题一样,只是规模更小
- 解决:递归地求出子问题。如果子问题的规模足够小,即停止递归,直接求解
- 合并:步骤将子问题的解组合成原问题的解
(此例子引用连接如下:https://www.zhihu.com/search?type=content&q=%E5%88%86%E6%B2%BB%E7%AE%97%E6%B3%95)
有这样一个经典的问题:有100枚硬币,其中1枚重量与众不同,是假币,更轻一些。如果用天平秤,请问至少称多少次一定能找到这枚假币
加入我们用传统的枚举法,显然至少需要比较50次
而假设我们采用分治法的话 ,流程如下:1. 将100硬币分成3份,33,33,34。
2.称量1、2份,若天平平衡,则假币必在另外34枚中。若不平衡,假币在轻的那33枚里。
3.将34枚分为11/11/12枚(或将33枚分成11*3)。
4.称量两组11枚的硬币,若平衡,假币在12枚里(或另外的11枚)若不平衡,假币在轻的11里。
5.将11(或12)枚分成3/4/4(或4/4/4),称量4/4,方法同上。
6.将剩下的3(或4)分为1/1/1(或1/1),称量1/1,若平衡,则剩下的一枚是假币,若不平衡,轻的是假币。 若还剩4枚,出现1/1平衡,剩下2枚则称量,显然轻的是假币。
这种方法只需要5次就能解决这个问题。
分治算法的流程: