算法与设计分析作业3(贪心)

本文介绍了贪心算法在两道问题中的应用:1. 超算与PC任务调度,通过按照PC所需时间降序排序,证明了贪心策略的正确性和最优子结构;2. 最少雷达安装数目问题,同样利用贪心策略,按区间的末端点升序排序,证明了贪心选择的正确性。最后,实现了一个使用 Hufflman 编码进行文件压缩与解压缩的 C++ 程序,并比较了不同文件的压缩效果。
摘要由CSDN通过智能技术生成

算法与设计分析作业3(贪心)


2 Greedy Algorithm

​ There are n distinct jobs, labeled J1,J2,···,Jn, which can be performed completely independently of one another. Each jop consists of two stages: first it needs to be preprocessed on the supercomputer, and then it needs to be finished on one of the PCs. Let’s say that job Ji needs pi seconds of time on the supercomputer, followed by fi seconds of time on a PC. Since there are at least n PCs available on the premises, the finishing of the jobs can be performed on PCs at the same time. However, the supercomputer can only work on a single job a time without any interruption. For every job, as soon as the preprocessing is done on the supercomputer, it can be handed off to a PC for finishing.
​ Let’s say that a schedule is an ordering of the jobs for the supercomputer, and the completion time of the schedule is the earlist time at which all jobs have finished processing on the PCs. Give a polynomial-time algorithm that finds a schedule with as small a completion time as possible.

Pseudo-code
# 定义一个结构体(类)
# class Job
#   p  #实例变量p,表示任务在超级计算机上所需要花的时间
#   f  #实例变量f,表示任务在PC上所需要花的时间
# end
# @param {Job[]} Jobs
# @return {Job[]}
function find_minimum_time_schedule(Jobs)
    以f为优先级对jobs按降序排序
    return Jobs
end
Prove the correctness

​ 按照PC上所需要的时间降序排序后获得的顺序,即是能最早完成所有任务的顺序。所最少花的时间是

[ img+img ].max 1<=j<=n。对于任务j来说,它完成的时间是img+img ,所有任务完成的时间取最大值即是最早完成任务的时间。

​ 证明该问题有贪心选择的性质。由于我们以f为优先级对jobs按降序排序,所以job1的f1是最大的,job1也是第一个做的,假设最优解B中job1不是最先做的。而是在第k项任务开始做(k>1),那么对于B来说完成第k项任务所需要的时间是img+img(j=k) (因为fk是最大的,且前面超算用的p的和也是最大的),而这个值大于以PC上所需要的时间降序排序后获得的顺序任意一个任务完成的时间,这与B是最优解矛盾(假设只有两个任务J1和J2,f1>f2,第一种情况:J1在前J2在后(按照贪心选择性质),则J1完成的时间是p1+f1,J2完成的时间是p1+p2+f2。第二种情况,J1在后J2在前,J1完成的p1+p2+f1,这个值大于第一种情况的任何任务的完成时间)。所以该问题有贪心选择性质,最优解中包含让f最大的任务先做。

​ 该问题有最优子结构性质。当第一个任务被选择之后(f最大的任务),我们可以用相同的算法来选择接下来的n-1个任务。因此该问题可以用贪心算法完成。

The complexity of your algorithm

​ 时间复杂度主要是排序算法的时间为O(nlogn)。

3 Greedy Algorithm

​ Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coasting, can only cover d distance, so an island in the sea can be covered by a radius installation, if the distance between them is at most d.

​ We use Cartesian coordinate system, defining the coasting is the x-axis. The sea side is above x-axis, and the land side below. Given the position of each island in the sea, and given the distance of the coverage of the radar installation, your task is to write a program to find the minimal number of radar installations to cover all the islands. Note that the position of an island is represented by its x-y coordinates.

Pseudo-code
# 定义一个结构体(类)
# class Pos  #岛的位置
#   x  #岛的横坐标
#   y  #岛的纵坐标
# end
# class Interval #想要探测到岛雷达在横轴安装的区间
#   s  #区间的开始
#   e  #区间的结束
# end
# @param {Pos[],Integer} 
# @return {Integer}
function find_minimal_installations(poss,d)
    len=poss.length
    return 0 if len==0
    定义一个Interval数组intervals长度为len
    for i in 0...len
      return -1 if poss[i].y>d
      intervals[i].s=poss[i].x-sqrt(d*d-poss[i].y*poss[i].y)
      intervals[i].e=poss[i].x+sqrt(d*d-poss[i].y*poss[i].y)  
    end
    intervals.sort #以intervals[i].e为优先级升序排序
    tmp=intervals[0].e
    count=1
    for i in 1...len
      if tmp<intervals[i].s
        tmp=intervals[i].e
        count
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值