贪婪算法

贪婪算法分阶段工作,在每一个阶段,可以认为所做决定是好的,而不考虑将来的后果。通常,这意味着选择的是某个局部最优。当算法终止时,我们希望局部最优等于全局最优。如果是这样的话,那么算法就是正确的;否则,算法得到的是一个次最优解。

下面介绍一些贪婪算法的应用。

哈夫曼编码

哈夫曼编码可用于文件压缩。

假设我们有一个文件,它只包含字符a,e,i,s,t,空格,换行(newline)。设该文件有10个a,15个e,12个i,3个s,4个t,13个空格,1个换行。如下图所示,次文件需要174比特来表示,因为共有58个字符,而每个字符需要3个比特。

考虑如何对上述编码进行改进,从而用更少的比特数表示该文件。我们首先将上述的标准编码方案使用字典树(trie树)表示。用0表示左分支,用1表示右分支,所有的字符都在叶子节点上,节点的深度即对应字符的编码的长度。

一种比上述稍好一点的编码是将newline符号放到其更高一层的父节点上。newline符号仍然处于叶子节点上,保证了所有字符都只放在树叶上。之所要保证所有的字符都只放在树叶上,是为了使得所有字符的编码都不会是另外一个编码的前缀,从而使得任何比特序列总能够被毫不含糊地译码。这样的编码又叫做前缀码(prefix code)。

对于一种编码方案,用其表示一个文件,所需要的总比特数(cost)为:cost = \sum d_{i}f_{i}其中d_{i}表示字符i的深度,f_{i}表示字符在文件中出现的次数(频率)。所以为了使得cost取得最小值,一种思路是f_{i}越大的字符,我们令其d_{i}越小。即出现频率越高的字符,在编码中,令其编码长度越小。这就是哈夫曼算法的思想。

哈夫曼算法(Huffman's algorithm)描述如下:
算法是针对由树组成的一个森林进行(一个字符就是一棵单节点树,上面的例子中有7个字符,就是7棵单节点树构成的森林),假设初始森林中共有C棵单节点树,即C个字符。
1.一棵树的权等于它的所有叶子节点的频率的和。(单节点的树即该节点的频率)。
2.选取最小权的两棵树T1和T2,并任意形成以T1和T2位子树的新树,将这样的过程进行C-1次。算法结束时,得到一颗树。

最后得到的二叉树的编码方式,其实就是最优前缀码,如下图所示。


该算法是贪婪算法的原因在于,在每一阶段我们都进行一次合并而没有进行全局的考虑,我们只是选择两颗最小的树。

近似装箱问题

考虑解决装箱问题的算法。这些算法将运行得很快,单未必产生最优解,然而,可以证明所产生的解距离最优解不太远。

设给定N项物品,大小为s_{1},s_{2},...,s_{N},所有大小都满足0<s_{i}<1。问题是把这些物品装到最下数目的箱子中去,每个箱子的容量为1个单位。举例如下。

联机装箱问题(on-line bin packing problem)
在这种问题中,每一件物品必须放入一个箱子之后才能处理下一件物品。

脱机装箱问题(off-line bin packing problem)
在一个脱机装箱算法中,我们做任何事都需要等到所有的输入数据全被读取之后才进行。

联机算法
对于联机装箱问题,可证明,及时允许无限计算能力,也不总能够给出最优解。
1.首次适合算法
依序扫描所有箱子,并把新的一项物品放入足能盛下它的第一个箱子中。只有当前面那些放置物品的箱子已经容不下当前物品的时候,才开辟一个新的箱子。
可证明,假设M是最优箱子数,使用首次适合算法使用箱子数绝不多余\left \lceil \frac{17}{10}M \right \rceil
2.最佳适合算法
该算法不是把一项新物品放入所发现的第一个能够容纳它的箱子,而是放到所有箱子中能够容纳它的最满的箱子中。
此算法的使用箱子数的上届与首次适合算法相同。

脱机算法
所有联机算法的主要问题在于将大项物品装箱困难,特别是在输入的后期出现的时候。所以围绕这个问题的自然解决办法是先将各项物品排序,把最大的物品先装箱。
1.首次适合递减算法
先排序,然后应用首次适合算法装箱。
2.最佳适合递减算法
先排序,然后应用最佳适合算法装箱。
以上两种算法使用的箱子数绝不超过\frac{4M+1}{3}M

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,928评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,748评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,282评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,065评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,101评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,855评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,521评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,414评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,931评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,053评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,191评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,873评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,529评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,074评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,188评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,491评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,173评论 2 357