![b9e75554a309cb3c0c6c01545591eaaf.png](https://img-blog.csdnimg.cn/img_convert/b9e75554a309cb3c0c6c01545591eaaf.png)
这一节将介绍贪心算法,它的基本思想是:
![d0b49dc08f51e10d0a9121254c40e3c3.png](https://img-blog.csdnimg.cn/img_convert/d0b49dc08f51e10d0a9121254c40e3c3.png)
贪心算法产生优化解的条件是贪心选择性和优化子结构:
![63c746a99965daec20600029011bb66f.png](https://img-blog.csdnimg.cn/img_convert/63c746a99965daec20600029011bb66f.png)
优化子结构:
![e2f20abee79b74b888c8cef6f0b1d842.png](https://img-blog.csdnimg.cn/img_convert/e2f20abee79b74b888c8cef6f0b1d842.png)
一般的一个贪心算法是否正确,需要证明优化子结构和贪心选择性,接下来将从几个例子中来体会这种思想!
例1: 活动选择问题
![4adf78b27220519659eb923833624179.png](https://img-blog.csdnimg.cn/img_convert/4adf78b27220519659eb923833624179.png)
![e6bdf1b95fbcf255add0ab2f9ed20405.png](https://img-blog.csdnimg.cn/img_convert/e6bdf1b95fbcf255add0ab2f9ed20405.png)
思考 :该问题的优化子结构是?
该问题的优化子结构是:
![bf3acb8db40336c7cef362102405ebe9.png](https://img-blog.csdnimg.cn/img_convert/bf3acb8db40336c7cef362102405ebe9.png)
![424a9f2d97e3bf1f6be88210c01e0a3b.png](https://img-blog.csdnimg.cn/img_convert/424a9f2d97e3bf1f6be88210c01e0a3b.png)
贪心选择性:
![7c44005fe5c66732da8622525cfb060a.png](https://img-blog.csdnimg.cn/img_convert/7c44005fe5c66732da8622525cfb060a.png)
算法的伪代码如下:
![1318c5f839b43b062e7c2e87ee8de6d1.png](https://img-blog.csdnimg.cn/img_convert/1318c5f839b43b062e7c2e87ee8de6d1.png)
算法的复杂度分析:
![86b2de19dc7616abc4f716e44d6257d7.png](https://img-blog.csdnimg.cn/img_convert/86b2de19dc7616abc4f716e44d6257d7.png)
例2: 哈夫曼编码树
编码树是什么?
![8a69c1914e3999e2163fafdf5b6ccedf.png](https://img-blog.csdnimg.cn/img_convert/8a69c1914e3999e2163fafdf5b6ccedf.png)
编码树的代价是:
![08f67827c1536594df3d1a74ef6aa627.png](https://img-blog.csdnimg.cn/img_convert/08f67827c1536594df3d1a74ef6aa627.png)
![eb8884030480ff40e8722cb3cfe05ff7.png](https://img-blog.csdnimg.cn/img_convert/eb8884030480ff40e8722cb3cfe05ff7.png)
思考 :该问题的优化子结构是什么?贪心选择性是什么?
贪心选择性:
![f8ac3bffdaf27515dc549e6feb0ddb9c.png](https://img-blog.csdnimg.cn/img_convert/f8ac3bffdaf27515dc549e6feb0ddb9c.png)
![696b47f74ff64ccde822bee3b7fe3ac3.png](https://img-blog.csdnimg.cn/img_convert/696b47f74ff64ccde822bee3b7fe3ac3.png)
![d0602948b06441a35563ac89afda7110.png](https://img-blog.csdnimg.cn/img_convert/d0602948b06441a35563ac89afda7110.png)
![71f7072eacbe39e568852bca0a0d93d9.png](https://img-blog.csdnimg.cn/img_convert/71f7072eacbe39e568852bca0a0d93d9.png)
优化子结构:
![812534adc6fbfea18c42c2bad4309d9c.png](https://img-blog.csdnimg.cn/img_convert/812534adc6fbfea18c42c2bad4309d9c.png)
![2851a04e1baff0e933c7990ad09050c9.png](https://img-blog.csdnimg.cn/img_convert/2851a04e1baff0e933c7990ad09050c9.png)
![9dbc37d26b8c4f542f42ba52c0500781.png](https://img-blog.csdnimg.cn/img_convert/9dbc37d26b8c4f542f42ba52c0500781.png)
算法的伪代码如下:
![7a6fa6ce6ca9d1a4611c66f977cf11e3.png](https://img-blog.csdnimg.cn/img_convert/7a6fa6ce6ca9d1a4611c66f977cf11e3.png)
算法复杂度分析:
![958d569d3a64b5053b98e47349e65ccc.png](https://img-blog.csdnimg.cn/img_convert/958d569d3a64b5053b98e47349e65ccc.png)
例3:最小生成树
生成树和最小生成树的概念:
![491bda0914957a2d407e3b96505e83fc.png](https://img-blog.csdnimg.cn/img_convert/491bda0914957a2d407e3b96505e83fc.png)
例如,对于下方的一个加权无向图,其几种可能的生成树如下(其中红色的生成树是该图最小生成树):
![5349ab6038bbabd3692d8445947bcd97.png](https://img-blog.csdnimg.cn/img_convert/5349ab6038bbabd3692d8445947bcd97.png)
![72dbd17d9804f0ace0b8957055437cc7.png](https://img-blog.csdnimg.cn/img_convert/72dbd17d9804f0ace0b8957055437cc7.png)
思考 :贪心选择性是什么?最优子结构是什么?
(每次选择最小的边。。。。------> Kruskal算法)
贪心选择性:
![0b8ca01e2e5020192db940f7213999f5.png](https://img-blog.csdnimg.cn/img_convert/0b8ca01e2e5020192db940f7213999f5.png)
优化子结构:
![d179cf7f528583a0b51bffc9eab65f8b.png](https://img-blog.csdnimg.cn/img_convert/d179cf7f528583a0b51bffc9eab65f8b.png)
其中
![ccf06129e69fcc9192c0fe053e524fb4.png](https://img-blog.csdnimg.cn/img_convert/ccf06129e69fcc9192c0fe053e524fb4.png)
写出算法的伪代码如下,这里使用到了并查集:
![86b0eca07c12411449c22c32396fb6b4.png](https://img-blog.csdnimg.cn/img_convert/86b0eca07c12411449c22c32396fb6b4.png)
算法复杂度分析:
![6f9eab016e5989d08c0370719613352a.png](https://img-blog.csdnimg.cn/img_convert/6f9eab016e5989d08c0370719613352a.png)
同样的思想,也有另外一种实现方式(Prim算法):
![4d0907b6fdb686f6e50c5ce7fa82183a.png](https://img-blog.csdnimg.cn/img_convert/4d0907b6fdb686f6e50c5ce7fa82183a.png)
算法复杂度分析:
![fca5e8b77effc1856c3db0544489544d.png](https://img-blog.csdnimg.cn/img_convert/fca5e8b77effc1856c3db0544489544d.png)
参考资料:
【1】哈工大骆吉洲《算法分析与设计》PPT