贪婪算法

贪婪算法每个阶段选择当前的局部最优解,保证正确性的前提下,能保证得到一个正确解,但是无法保证贪婪算法的结论是最优解

作业调度问题:有作业j_{1},j_{2},...,j_{N},对应的运行时间是t_{1},t_{2},...,t_{N},只有一个处理器,如何安排作业使得所有作业完成的时间最小?

解:第一个作业在t_{1}时间之后完成,第二个作业在t_{1}+t_{2}时间之后完成,以此类推,得到总时间是

C=\sum_{k=1}^{N}(N-k+1)t_{k}

整理为C=(N+1)\sum_{k=1}^{N}t_{k}-\sum_{k=1}^{N}k\cdot t_{k}

式中第一项无论怎么安排作业都是一定的,第二项必须运行时间少的作业在前面,否则若存在x> y使得t_{x}<t_{y},那么显然总时间会变长。

多处理器调度问题:和单处理器类似,将所有作业按照完成时间从小到大的顺序,依次循环填充到每个处理器中,证明这样是最优的和单处理器类似,注意最后一组作业填充顺序是随机的,因为无论怎样填充,都不会影响总时间

huffman编码:每个字符都是由bit编码的,比如一共有7种字符,那么需要3个bit就能唯一表示每一种字符而不会产生歧义。huffman编码是利用二叉树压缩文件的一种方式,树叶是字符,每个顶点的两条通向两个儿子的边是0和1

huffman算法:算法对一个树组成的森林进行,一个树的权是所有树叶的频率和,每个阶段选择权最小的两棵树,合并成新树,将这个过程进行N - 1次,最终得到的就是huffman树,正确性证明和单处理器作业调度类似,选择两个节点交换计算总权值

近似装箱问题:给定N项物品,大小是s_{1},s_{2},...,s_{N},所有大小满足0< s_{i}\leq 1,问题是将这些物品装入最小数量的箱子中,每个箱子大小都是1。有联机和脱机两种版本的装箱问题

联机装箱算法:

联机算法不总能给出最优解,一个例子是,给定重量为\frac{1}{2}-\varepsilon的M个小项和\frac{1}{2}+\varepsilon的M个大项,那么最优解是装在M个箱子里,要做到最有解,前面M个小项必须占满M个箱子。但是,给定另一组重量是\frac{1}{2}-\varepsilon的M个物品,最优解是M/2个箱子,然而联机算法对同样的输入序列产生同样的解,因此也必然将M个物品放到M个箱子中,因此联机算法无法保证给出最优解,这也是装箱问题中近似的含义

定理1:存在任意的使联机装箱算法至少使用\frac{4}{3}最优箱子数的输入

证明:反证法,假设小于\frac{4}{3},考虑对序列I上的联机算法A,序列是M个小项和M个大项,设A在处理第M个物品之后,使用了b个箱子,这个时候最优解是\frac{M}{2}个箱子,有

\frac{b}{M/2}< \frac{4}{3}

考虑全部装箱之后,算法A在b个箱子后面新开辟的箱子里面每个只能装一个物品,因为是M个大项,只能放在一个箱子里面,而前面b个箱子每个最多放2个物品,这样算法A至少使用的箱子个数是

b+2M-2b=2M-b,得到:

\frac{2M-b}{M}< \frac{4}{3}

两式矛盾,从而证明定理

定理1表述了装箱问题的极限,有3种算法,保证所用箱子数不超过最优解的两倍

1.下项适合算法

当处理一个物品的时候,检查看能否装进刚才装进物品的同一个箱子中,若能装进去,那么装,否则开辟一个新的箱子,时间是O(N)

定理:令M是将一系列物品装箱的最优解,下项适合算法使用的箱子数不超过2M

证明:考虑两个相邻的箱子,这两个箱子中的物品之和一定大于1,否则就能装一个箱子中了,这样一定不会超过2M个箱子

2.首次适合算法

每次处理一个箱子的时候,扫描前面的所有箱子,将它装入能装入的第一个箱子中,时间是O(N^2)

3.最佳适合算法

处理一个新物品的时候,把这个物品放入装入它之后最满的箱子,使用伸展树保存每个箱子还能容纳的最大物品数,时间是O(NlogN)

脱机算法

脱机算法先获取了所有输入,可以对输入进行排序,从大到小,然后再应用首次适合递减算法或者最佳适合递减算法,首次适合递减算法使用的箱子数不超过(4M+1)/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个,那么\sum_{i=1}^{N}s_{i}\leq M,设前M个箱子中的物品重量是w_{i},后面M个物品每个物品大小是x_{j},那么有

\sum_{i=1}^{N}S_{i}\geq \sum_{j=1}^{M}w_{j}+\sum_{j=1}^{M}x_{j}

由于w_{j}+x_{j}> 1,否则就能放入一个箱子中了,这样得到\sum_{i=1}^{N}s_{i}> M,矛盾,从而证明引理2

定理:令M是将物品装箱的最优箱子数,首次适合递减算法所用箱子数不超过(4M+1)/3

证明:应用引理1和引理2,在M-1项外加物品中,每个大小最多是1/3,因此,最多存在(M-1)/3个外加的箱子,得到定理

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值