算法设计与分析第四章——贪心算法分析题

 这个题目类似于例题中的4.7多机调度问题,因为比较简单所以我没写解析,其核心思想就是将处理时间从大到小排序再一次分给所有机器,这种算法肯定不是最优解,不过胜在简单。

首先两个磁带是并行的,若要使得两个磁带的检索时间尽可能小,我们也用多机调度的思想,将处理程序按时间顺序或逆序排列,然后依次分配给两个磁道。很多时候贪心算法并不能给出最优解,我们可以这样思考,要使得时间最短,比如我先分配给1,接下来该分配给2了,但是1的时间还是短于2的时间,如果分配给2肯定没有分配给1之后的时间短。我们的分配策略不应该是按顺序分配,而是看那个通道时长短就分配给谁,这样即使不是最优解也一定比原先的解要好。因此我们可以用这种方法加以改进。再看题目给出的问题,如何证明两种方法都不能得到最优解:

 

最理想的情况肯定是所有任务平均分配,每个磁道长度正好为1/2的L之和。那么最短磁道的长度只有可能<=1/2的L之和。若要使得总长尽可能小,那就需要最长的磁道尽可能小,即最短的磁道尽可能大,所以得出如上结论。


贪心算法大多数情况下是不能得到最优解的,除了哈夫曼树,单源最小路径的Dijkstra算法,最小生成树的Kruskal算法和Prim算法,碰到其他类型的都要思考一下是否是最优解,尤其问题越复杂,越难以得到最优解。


 

 

题目所给的A-H如图所示,易得规律,叶子节点上的数字是斐波那契数列,二叉树总共有n层(算上根节点),正好对应前n个斐波那契数 ,第二层叶子节点对应第8个,第三层叶子对应第七个,依次类推,第t+2层结点对应第n-t个斐波那契数(n-2>t>=0)。而第n层对应的两个叶子结点都是1。t层父结点则是其兄弟结点+对应层的斐波那契数,即前n个斐波那契数的总和。


 

哈夫曼树就是最优编码树,不过本题中要求用前缀码的序列,也就是根左右的顺序。最优前缀编码还有个特性,就是所得的编码一定不能是其他编码的前缀,

 

 

 

 图中给出的编码树并不是很标准,左右子树没有统一的大小关系。不过结构还是不变的,因为考虑到只有叶子结点才能存放内容,在二叉树中,度为2的结点数=度为0的结点数-1。因此叶结点n个,内结点为n-1个。这是一个完全二叉树,只有度为2的结点和度为0的结点,因此总结点树=n+n-1=2n-1。而编码的长度>=总结点树2n-1。每个字符需要N=ceil(log(n))个位(bit),最后编码序列就是题目所给答案。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值