计算机算法基础贪心算法带有限期的作业问题

根据提供的信息,我们可以深入探讨“计算机算法基础贪心算法带有限期的作业问题”。这个问题主要关注如何通过贪心策略来解决一系列有截止日期的任务分配问题。 ### 贪心算法介绍 贪心算法是一种在每一步选择中都采取当前看来最好的选择的方法,以此希望最终达到全局最优解的算法。它通常应用于最优化问题中,如寻找最小成本、最大利润等。贪心算法的优点是简单直观,易于实现;缺点是并不总是能得到全局最优解。 ### 带有限期的作业问题 带有限期的作业问题是指有一组任务需要在一定时间内完成,每个任务都有一个截止时间(deadline),并且完成后可以获得一定的收益或利润。任务的目标是在满足所有截止时间的前提下最大化总收益。该问题可以形式化为:给定一组任务\( T = \{T_1, T_2, ..., T_n\} \),每个任务\( T_i \)有完成时间\( a_i \)、截止时间\( D_i \)以及收益\( P_i \)。目标是找到一个作业计划,使得总收益最大化。 ### 问题解决方案 题目中给出了一段代码实现,其核心思想在于使用贪心算法进行任务分配。具体步骤如下: #### 数据结构定义 - **D[]**:存储每个任务的截止时间。 - **P[]**:存储每个任务的收益。 - **F[]**:用于记录每个时间段的任务状态。 - **J[]**:存储最终选择的任务序列。 - **Q[]**:存储每个时间段被分配的任务。 #### 关键算法 1. **FIND 函数**:查找任务的父节点。在这个上下文中,“父节点”实际上指的是任务所在的当前时间段。 - 输入:指向父节点的指针数组`parent`,索引`i`。 - 输出:返回索引`i`的根节点。 2. **UNION 函数**:合并两个时间段。如果两个时间段相邻,则将它们合并为一个时间段。 - 输入:指向父节点的指针数组`parent`,索引`i`和`j`。 - 输出:将索引`i`和`j`表示的时间段合并。 3. **MIN 函数**:返回两个整数中的较小值。 4. **MAXMUM 函数**:返回两个整数中的较大值。 5. **MAX 函数**:返回数组中指定区间内的最大值。 6. **Insertionsort 函数**:对数组进行插入排序。 #### 主函数 FJS 1. **初始化**:为每个时间段分配一个唯一标识符,并将每个时间段的状态标记为未分配任务。 2. **循环处理**:对于每一个任务,找到最早能够安排该任务的时间段,并将任务分配到该时间段。如果找不到可用时间段,则不安排该任务。 3. **合并操作**:在将任务分配到某时间段后,若该时间段的下一个时间段为空闲,则将这两个时间段合并。 ### 时间复杂度分析 算法的时间复杂度为 \( O(n \alpha(2n, n)) \),其中 \( \alpha \) 是阿克曼函数的反函数,即极缓慢增长的函数。在实际应用中,\( \alpha \) 的值几乎总是小于 4,因此算法的时间复杂度接近线性。 ### 空间复杂度分析 算法的空间复杂度为 \( O(n) \),主要是由于需要存储任务列表、时间段状态以及辅助数据结构。 ### 实现细节 - **排序**:为了确保按照任务收益从大到小的顺序处理任务,使用了插入排序算法对任务的收益进行排序。 - **动态更新**:在处理过程中,不断更新时间段的状态以及任务的分配情况。 ### 总结 通过以上分析,我们可以看出该算法有效地利用了贪心策略来解决带有限期的作业问题。通过对任务进行合理排序,并且在每个步骤中选择最佳方案,算法能够在较短的时间内找到一个较好的解。虽然不能保证得到全局最优解,但在许多情况下已经足够优秀。这种类型的算法在实际应用中非常广泛,例如在生产调度、资源分配等领域都有着重要的作用。































算法描述:
line procedure FJS(D,n,b,j, k)
//找最优解J=J(1),…J(K)//
//D(1),…..,D(n)是期限值,n>=1.作业已按//P(1)>=P(2)>=….P(n)被排序,//b=min{n,max{D(i)}}//
integer b,i,k,n,j ,l,D(n),J(n),F(0:b),p(0:b)
for i=1to n do //将树置初值//
F(i)ßi;p(i)ß-1
repeat
Kß0 //初始化J//
for iß1 to n do //使用贪心规则//
jß FIND(min(n,D(i) ))
if F(j)不为0 then kßk+1;J(K)ßi //选择作业 i//
lßFIND(F(j)-1); call UNION(l,j)
F(j)ßF(1)
endif
repeat
end FJS
算法分析:此算法的时间复杂度为:O(na(2n,n))(Ackerman函数的逆函数。);
它用于F和P的空间至多为2n个字节。
完整的代码(C语言):
#include<stdio.h>
#include<malloc.h>
int FIND(int *parent,int i)
{//查找含有元素i的树根,使用压缩规则去压缩由i到根j的所有结点
int j,k,t;
while(parent[j]>0) j=parent[j];//找根
k=i;
while(k!=j){//压缩由i到根j的结点
t=parent[k];
parent[k]=j;
k=t;
}
return j;
}
void UNION(int *parent,int i,int j)
{//使用加权规则合并根为i和j的两个集合
int x;
x=parent[i]+parent[j];
if(parent[i]>parent[j]){//i的结点少
parent[i]=j;
parent[j]=x;
}
else{//j的结点少
parent[j]=i;
parent[i]=x;
}
}
int MIN(int n,int m)
{//求n和m的最小值
if(n>m) return m;
else return n;
}
剩余5页未读,继续阅读

- sue9009132012-11-13不错 有用的资源 对于贪心算法有帮助

- 粉丝: 1
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 大数据优势下的高中英语教学策略.docx
- 云计算环境下的网络安全估计模型态势仿真.doc
- ATS单片机的智能电热水器的设计方案.doc
- SQL数据库课程研究设计模板.doc
- 51单片机的智能频率计课程方案设计书.doc
- 企业信息化管理建议.docx
- 网站的规划与建设.ppt
- 计算机信息系统保密技术及安全管理.doc
- Excel表格模板:上半年销售业绩分析报告.xlsx
- DSP嵌入式图像处理方案设计书.doc
- 项目管理系统化建设内容及验收标准.doc
- 信息管理与计算机应用技术的融合研究.docx
- 微课在高职《计算机应用基础》课程单元教学中的设计与应用思考.docx
- 图书信息管理系统-c语言.doc
- 以单片机ATS为控制核交通灯设计.doc
- NAND-Flash的驱动程序设计措施.doc


