贪婪算法每个阶段选择当前的局部最优解,保证正确性的前提下,能保证得到一个正确解,但是无法保证贪婪算法的结论是最优解
作业调度问题:有作业,对应的运行时间是
,只有一个处理器,如何安排作业使得所有作业完成的时间最小?
解:第一个作业在时间之后完成,第二个作业在
时间之后完成,以此类推,得到总时间是
整理为
式中第一项无论怎么安排作业都是一定的,第二项必须运行时间少的作业在前面,否则若存在使得
,那么显然总时间会变长。
多处理器调度问题:和单处理器类似,将所有作业按照完成时间从小到大的顺序,依次循环填充到每个处理器中,证明这样是最优的和单处理器类似,注意最后一组作业填充顺序是随机的,因为无论怎样填充,都不会影响总时间
huffman编码:每个字符都是由bit编码的,比如一共有7种字符,那么需要3个bit就能唯一表示每一种字符而不会产生歧义。huffman编码是利用二叉树压缩文件的一种方式,树叶是字符,每个顶点的两条通向两个儿子的边是0和1
huffman算法:算法对一个树组成的森林进行,一个树的权是所有树叶的频率和,每个阶段选择权最小的两棵树,合并成新树,将这个过程进行N - 1次,最终得到的就是huffman树,正确性证明和单处理器作业调度类似,选择两个节点交换计算总权值
近似装箱问题:给定N项物品,大小是,所有大小满足
,问题是将这些物品装入最小数量的箱子中,每个箱子大小都是1。有联机和脱机两种版本的装箱问题
联机装箱算法:
联机算法不总能给出最优解,一个例子是,给定重量为的M个小项和
的M个大项,那么最优解是装在M个箱子里,要做到最有解,前面M个小项必须占满M个箱子。但是,给定另一组重量是
的M个物品,最优解是M/2个箱子,然而联机算法对同样的输入序列产生同样的解,因此也必然将M个物品放到M个箱子中,因此联机算法无法保证给出最优解,这也是装箱问题中近似的含义
定理1:存在任意的使联机装箱算法至少使用最优箱子数的输入
证明:反证法,假设小于,考虑对序列I上的联机算法A,序列是M个小项和M个大项,设A在处理第M个物品之后,使用了b个箱子,这个时候最优解是
个箱子,有
考虑全部装箱之后,算法A在b个箱子后面新开辟的箱子里面每个只能装一个物品,因为是M个大项,只能放在一个箱子里面,而前面b个箱子每个最多放2个物品,这样算法A至少使用的箱子个数是
,得到:
两式矛盾,从而证明定理
定理1表述了装箱问题的极限,有3种算法,保证所用箱子数不超过最优解的两倍
1.下项适合算法
当处理一个物品的时候,检查看能否装进刚才装进物品的同一个箱子中,若能装进去,那么装,否则开辟一个新的箱子,时间是
定理:令M是将一系列物品装箱的最优解,下项适合算法使用的箱子数不超过2M
证明:考虑两个相邻的箱子,这两个箱子中的物品之和一定大于1,否则就能装一个箱子中了,这样一定不会超过2M个箱子
2.首次适合算法
每次处理一个箱子的时候,扫描前面的所有箱子,将它装入能装入的第一个箱子中,时间是
3.最佳适合算法
处理一个新物品的时候,把这个物品放入装入它之后最满的箱子,使用伸展树保存每个箱子还能容纳的最大物品数,时间是
脱机算法
脱机算法先获取了所有输入,可以对输入进行排序,从大到小,然后再应用首次适合递减算法或者最佳适合递减算法,首次适合递减算法使用的箱子数不超过,证明如下:
引理1:N个物品按照从大到小的顺序排序,最优装箱数是M,首次适合递减算法放入额外的箱子中的物品大小最多是1/3
证明:反证法,设放入第M+1个箱子的物品大小超过1/3,那么前面所有物品都大于1/3,从而前M个箱子中每个最多有两个物品,并且前面M个箱子中一定是连续1个物品,和连续若干2个物品,否则若有两个箱子,前面的箱子中有2个物品,后面的有1个物品,那么再放物品的时候,一定可以放入后面的这个箱子,因为前面的箱子中的两个物品一定比后面的箱子中的两个物品大。设前j个箱子装了一个物品,后面M-j个箱子装2个物品,有如下结论:
前面j个物品使用任何算法都没法将2个放入一个箱子中,否则若有这样的算法,那么首次适合算法也能放
放入外加箱子中的物品若大于1/3,那么首先不能放入前j个箱子,然后后面每个箱子只能放2个,也方不进去,否则有一个箱子会有3个物品,这样矛盾,从而证明引理1
引理2:放入外加箱子中的物品的个数最多是M-1个
证明:反证法,假设放入外加箱子中的物品有M个,那么,设前M个箱子中的物品重量是
,后面M个物品每个物品大小是
,那么有
由于,否则就能放入一个箱子中了,这样得到
,矛盾,从而证明引理2
定理:令M是将物品装箱的最优箱子数,首次适合递减算法所用箱子数不超过(4M+1)/3
证明:应用引理1和引理2,在M-1项外加物品中,每个大小最多是1/3,因此,最多存在(M-1)/3个外加的箱子,得到定理