Update
This commit is contained in:
47
problems/贪心算法理论基础.md
Normal file
47
problems/贪心算法理论基础.md
Normal file
@@ -0,0 +1,47 @@
|
||||
|
||||
期盼通过每个阶段的局部最优选择,从而达到全局最优
|
||||
|
||||
当前子问题的最优解
|
||||
|
||||
一个子问题的最优解会是下一个子问题最优解的一部分,重复这个操作直到堆叠出该问题的最优解
|
||||
|
||||
贪心算法最关键的部分在于贪心策略的选择,贪心选择的意思是对于所求问题的整体最优解可以通过一系列的局部最优选择求得。
|
||||
|
||||
而必须注意的是,贪心选择必须具备无后效性,也就是某个状态不会影响之前求得的局部最优解。
|
||||
|
||||
|
||||
很多同学做贪心的题目的时候,想不出来是贪心,想知道有没有什么套路可以一看看出来是贪心,说实话贪心算法并没有固定的套路。
|
||||
|
||||
所以唯一的难点就是如何通过局部最优,推出整体最优。
|
||||
|
||||
那么如何能看出局部最优是否能退出整体最优呢?有没有什么固定策略呢?
|
||||
|
||||
不好意思,也没有,靠自己手动模拟,如果模拟可行,就可以试一试贪心策略,不过不可行,可能需要动态规划了。
|
||||
|
||||
那又有同学想手动模拟得出的结论不靠谱,想要严格的数学证明。
|
||||
|
||||
做了贪心题目的时候大家就会发现,如果啥都要数学证明,就是把简单问题搞复杂了。
|
||||
|
||||
举一个不太恰当的例子:我要用一下1+1 = 2,但我要先证明1+1 为什么等于2。严谨是严谨了,但有这个必要么。
|
||||
|
||||
虽然这个例子有点极端,但可以表达出我的意思,就是手动模拟一下感觉可以局部最优推出整体最优,那么就试一试贪心。
|
||||
|
||||
|
||||
刷题的时候什么时候真的需要数学推导,例如环形链表2,这道题目不用数学推导一下,就找不出环的其实位置,想试一下就不知道怎么试,这种题目确实需要数学简单推导一下。
|
||||
|
||||
但贪心问题就不必了,模拟一下感觉是这么回事,就迅速试一试。
|
||||
|
||||
,但毕竟熟能生巧嘛,算法的基本思想总是固定不变的。
|
||||
|
||||
贪心算法求解步骤
|
||||
* 将问题分解为若干个子问题
|
||||
* 找出适合的贪心策略
|
||||
* 求解每一个子问题的最优解
|
||||
* 将局部最优解堆叠成全局最优解
|
||||
|
||||
|
||||
例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?
|
||||
|
||||
每次拿最大的啊,这就是局部最优,然后可以退出全局最优。
|
||||
|
||||
但例如是 有一堆盒子,你有一个背包体积为n,如何把背包尽可能装满, 如果还每次选最大的盒子,一定不行。这时候就需要动态规划。
|
||||
Reference in New Issue
Block a user