任务调度c语言数据结构,数据结构课程设计——贪心算法:任务调度问题.doc

该博客主要探讨了如何使用贪心算法解决任务调度问题,以最小化任务的平均完成时间。通过对任务按照完成时间从小到大排序,实现最短作业优先的策略,从而达到优化平均完成时间的目标。文章详细介绍了设计思路、实现过程、测试方法及结果分析,展示了贪心算法在实际问题中的有效应用。
摘要由CSDN通过智能技术生成

永磁同步电机双环调速系统的仿真研究

数据结构课程设计——贪心算法:任务调度问题

PAGE 8

PAGE 1

数据结构课程设计

贪心算法

专业

软件工程

班级

学号

学生姓名

数据结构课程设计——贪心算法:任务调度问题

PAGE 1

数据结构课程设计——贪心算法:任务调度问题

目 录

TOC \o "1-5" \h \z \u HYPERLINK \l "_Toc391048674" 1 设计题目 PAGEREF _Toc391048674 \h 1

HYPERLINK \l "_Toc391048675" 2 设计分析 PAGEREF _Toc391048675 \h 1

HYPERLINK \l "_Toc391048676" 3 设计实现 PAGEREF _Toc391048676 \h 4

HYPERLINK \l "_Toc391048677" 4测试方法 PAGEREF _Toc391048677 \h 7

HYPERLINK \l "_Toc391048678" 4.1测试目的 PAGEREF _Toc391048678 \h 7

HYPERLINK \l "_Toc391048679" 4.2 测试输入 PAGEREF _Toc391048679 \h 7

HYPERLINK \l "_Toc391048680" 4.3 正确输出 PAGEREF _Toc391048680 \h 7

HYPERLINK \l "_Toc391048681" 4.4 实际输出 PAGEREF _Toc391048681 \h 7

HYPERLINK \l "_Toc391048682" 5 分析与探讨 PAGEREF _Toc391048682 \h 8

HYPERLINK \l "_Toc391048683" 5.1 测试结果分析 PAGEREF _Toc391048683 \h 8

HYPERLINK \l "_Toc391048684" 5.2 探讨与改进 PAGEREF _Toc391048684 \h 8

HYPERLINK \l "_Toc391048685" 6 设计小结 PAGEREF _Toc391048685 \h 8

PAGE 1

1 设计题目

有n项任务,要求按顺序执行,并设定第i项任务需要t[i]单位时间。如果任务完成的顺序为1,2,…,n,那么第i项任务完成的时间为c[i]=t[1]+…+t[i],平均完成时间(Average Completion Time,ACT)即为(c[1]+…+c[n])/n。本题要求找到最小的任务平均时间。

输入要求:

输入数据中包含几个测试案例。每一个案例的第一行给出一个不大于2000000的整数n,接着下面一行开始列出n个非负整数t(t<=1000000000),每个数之间用空格相互隔开,以一个负数来结束输入。

输出要求:

对每一个测试案例,打印它的最小平均完成时间,并精确到0.01。每个案例对应的输出结果都占一行。若输入某一个案例中任务数目n=0,则对应输出一个空行。

输入例子:

4

4 2 8 1

-1

表示有四个任务,各自完成需要的时间单位分别是4,2,8,1,第三行输入-1表示结束。

输出例子:

要求程序运行后的输出结果为:6.50。

2 设计分析

算法是为了求解一个问题需要遵循的,被青春地指定的简单指令的集合。任何程序基本上都是要用特点的算法来实现的。算法性能的好坏,直接决定了所实现程序性能的优劣。贪心算法通过一系列的选择来的得到一个问题的解。它所做的每一个选择都是当前的状态下某种意义的最好选择,即贪心选择。希望通过每次所做的贪心选择导致最终结果问题的一个最优解。这种启发式的策略并不总能奏效,然而在许多情况下能达到预期的目的。

这个题目属于贪心算法应用中的任务调度问题。要得到所有任务的平均完成时间,只需要将各个任务完成时间从小到大排序,任务实际完成需要的时间等于它等待的时间与自身执行需要的时间之和。这样给出的调度是按照最短作业优先进行来安排的。

明确了可以用最短作业优先的思想后,就可以正式来设计题目的实现了。首先,输入的测试案例可以有很多组,每一个案例的输入格式都是第一行输入任务的个数,然后下面一行输入每一个任务需要的时间单位,输入完成另起一行,可以再继续输入下一个案例的数据。最后用一个任意的负数来表示输入的结束。这样,由于案例的个数开始不得知,所以可以套用一个for循环。

for(n=0;n>=0;) /*当n小于0的时候,退出程序*/

{

scanf(“%ld”,&n);

if(n>0)

{

建立一个具有n个元素的数组

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
#include #include #include //队列最大长度 #define MAX_QUEUE 1024 //偷懒,就用静态队列了 static int mQueue[MAX_QUEUE]; //队列插入 void InsertData(int **Front, int **Rear) { if (*Rear + 1 == *Front && (*Rear + 1 - MAX_QUEUE != *Front)) { //当队列数据已满,返回 puts("Queue Size Overflow!\n"); return; } else if (*Rear - mQueue > MAX_QUEUE) { //实现的是类似循环队列,但由于是静态线性队列(数组) //而不是用链表来实现的,所以到静态队列(数组)尾部,尾指针自动指向(数组)头部 *Rear = mQueue; } puts("Input Data:"); scanf("%d", *Rear); //输入数据后,尾指针后移 *Rear += 1; } //从头指针删除一个队列中的数据 void DeleteData(int **Front, int **Rear) { if (*Front == *Rear) { //头指针尾指针重合,队列空,不能删除,返回 puts("Queue Empty!\n"); return; } else if (*Front - mQueue > MAX_QUEUE) { //参考 Rear *Front = mQueue; } //从头指针删除一个数据 *Front += 1; } //显示队列数据 void ShowData(int **Front, int **Rear) { int *temp; for (temp=*Front; temp!=*Rear; temp++) { printf("%d --> ", *temp); } puts("\n"); } void usage(void) { puts("1. Insert Data"); puts("2. Delete Data"); puts("3. Show Data"); } int main(int argc, char **argv) { //头指针,尾指针 //队列的一个特性 First in first out FIFO int *pFront, *pRear; int op_code; //初始化队列,头指针和尾指针此时指向的地址相同 pFront = pRear = mQueue; while (1) { usage(); scanf("%d", &op_code); switch (op_code) { case 1: printf("%p\n", pFront); printf("%d\n", *pFront); InsertData(&pFront, &pRear); break; case 2: DeleteData(&pFront, &pRear); break; case 3: ShowData(&pFront, &pRear); break; default: break; } } return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值