【技术文档】《算法设计与分析导论》R.C.T.Lee等·第3章 贪心法

阅读这样的技术书籍该怎样写博文呢?如果只是简单地把书上的知识抄到网上来,自己抄着费劲,读者看着也没意思;如果只是谈自己对知识的理解和看法,那些没有接触过这些知识的人就不知道你在说什么。左右权衡,我就暂时将写这类技术书籍的博文的基本原则定为:用极简洁的文字阐述清楚问题和解法。现在就让我们来试试这样的效果吧。


贪心法可以理解为目光短浅者解决问题的方法,他们在解决问题时只能看到眼前的利益,不能看到长远的利益。以我们所受的教育来看,这样的做法显然是不合理的,但现实中确实存在一些场景,可以用贪心法得到最优解,比如下面的几个场景。

生成最小生成树的Kruskal算法。用“极简洁”的语言描述这个问题就是求一个带权连通无向图的一棵最小生成树。Kruskal解法概括起来就四个字:以边找点。具体一点的说就是判断现阶段权最小的边加入后是否和已加入的边构成了环,如果是,则此边不能加入,否则此边为最小生成树中的一条边。“找点”体现在“判断是否成环”上。不知道这么写,读者是否有收获?

生成最小生成树的Prim算法。问题同Kruskal算法,在这就累赘了。Prim算法也可以概括为四个字,而且和Kruskal算法恰好相反:以点找边。具体一点的说就是将顶点分成两个集合,寻找两个集合之间权最小的边,将此边的顶点放入构成最小生成树的集合当中。

解决单源最短路径问题的Dijkstra算法。单源最短路径问题是求一个带权的有向图中一点到其余各点的最短路径问题。Dijkstra算法可以理解为该点到其余各点的最短路径不断更新的过程。具体的做法是画一个表格,第一行写其余各点的编号,余下行写该点到其余各点的最短距离,每一行距离最小的点可确定为所求的最短路径的点,写下一行最短路径时,需要考虑上一行刚刚确定的最短路径的点对这一行最短路径的计算的影响。

二路归并问题。由若干个含有若干元素的有序表得到一颗最优二路归并树。算法核心很简单:元素最少的有序表先归并。最优二路归并树的一个典型应用就是赫夫曼(Huffman)编码。

最小圈基问题。指一个含有大大小小若干个圈的有权无向图,找出这个图可以划分成几个圈,此时这几个圈的权之和最小(书中专业说法:给定一个图,找到这个图的最小圈基)。利用贪心法解决这个问题的算法是:将所有圈按权重有序排列,依次加入,若此圈能被之前加入的圈画出,则舍弃,否则将此圈加入最小圈基中。

2终端一对多问题。有一对平行线,这两条线上有相对应的刻度(书中专业名词:终端),现在要求将上一行中被标志的刻度以一对一的方式连接到下一行中被标志的刻度上,任何两条连线不能交叉,且使得连线的总体倾斜度(书中专业名词:最大局部密度)最小。用贪心法求解这个问题有个先决条件:已经确定了这个问题的最优解的最大局部密度的值,不妨设为d。算法为:从左到右依次连接上下终端,若此时最大局部密度小于d+1,则连接成功,否则尝试连接下一行的下一个终端。

贪心法的思想是简单的,好理解的,但是应用贪心法,我觉得有两处难点:一是被思维框住,不能将求问题的最优解转化到求局部最优解;第二点是证明贪心法的正确性有一定的难度,即证明此时的局部最优解就是全局最优解。


写完这篇博文才发现,没有接触过这些知识的人不会知道我所说的,哎,就这样吧,以后自己翻翻,能回忆起整个算法就算没有白写吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值