代码改变世界

算法导论-贪心算法习题解

2012-04-22 08:56  meteorgan  阅读(1919)  评论(1编辑  收藏  举报

16.2-6 说明如何在O(n)时间内解决部分背包问题。

  解:先求avgi = vi/wi,如果按照avgi从大到小排序,再贪心选择的话,时间复杂度为O(nlgn),当然可以采用非比较的排序算法达到O(n)的时间复杂度。更一般的情况,不需要排序,例如:如果a1, a2,a3是avgi 最大的三个物品,如果它们的总量和不大于W,我们是不需要知道它们间的相对顺序的。于是有以下算法:找avg 的中位数m,将avg 分为三个集合G = {ai: avgi < m}, Q = {ai: avgi = m}, P = {ai: avgi > m}。分别对G, Q, P中元素求和得SG, SQ, SP。

    1. 如果W < SG, 则令物体的集合为O = G,对集合O递归进行上述过程。

    2. 如果 SG<=W <= SG+SQ,则将集合G中的元素都放入包中,并将集合Q总元素尽可能多的放入包中,结束。

              3. 如果 SG+SQ < W, 将G,Q中元素放入包中。令物体集合O = P,总重W = W - SG - SQ。递归进行上述过程。

              时间复杂度为T(n) = T(n/2) + O(n), T(n) = O(n)。

 

  16-2 最小化平均时间调度

  解:a) 按照最短pi 优先调度。

    b) 按照ri 递增的顺序启动任务,启动aj 时,如果当前任务a的剩余时间大于a,则aj 抢占ai。如果没有任务到达且当前人物完成,则从挂起的任务中挑选剩余时间最短的任务开始运行。