贪心方法的一个实例。问题大概就是处理n个作业,每个作业都有完成期限(Deadline),要求安排作业序列使效益达到最大。
算法的实现书上给了两种,一种是根据期限挨个插入,一种利用了树的思想。本文给出了第一种的Java实现。
首先必须按效益从大到小把作业排序,当然对应的D数组也对应排好。依次将作业加入到集合J中,如果不违反任何已存在与J中的作业完成期限即可插入该作业。这个方法非常直观,因此即使复杂度比树方法稍高,我也更倾向于这种方法。
算法实现如下:
public static int[] job(int[] D){
int[] j=new int[D.length];
j[0]=0;j[1]=1;
D[0]=0;
for(int i=2;i<D.length;i++)
{
int r=i;
while(D[i]<D[j[r-1]] && D[j[r-1]]>r-1)
r=r-1;
if(D[j[r-1]]<=D[i] && D[i]>=r)
{
for(int k=i-1;k>=r;k--)
j[k+1]=j[k];
j[r]=i;
}
}
return j;
}
显然D已经根据P集合排好序了。由于涉及到作业标号,把D的大小设置为作业数加一。
直接把排序也放上
public void bubble(int[] x,int[] y){
for(int i=0;i<x.length-1;i++)
for(int j=i;j<x.length-1;j++)
if(x[j]<x[j+1])
{
int temp=x[j];
x[j]=x[j+1];
x[j+1]=temp;
int temp1=y[j];
y[j]=y[j+1];
y[j+1]=temp1;
}
}
x是效益数组,y是期限数组。