磁盘驱动调度问题

题目:

输入一个请求序列:

98,183,37,122,14,124,65,67

n=8
假设磁头一开始的位置start处于c(c不在序列中的任何位置),例如c=53

如果采用最短寻道优先SSTF,输出序列的调度顺序和磁头移动总数。

解题思路:

将请求的序列有序地进行排列,甚至将起始结点 53 也加入序列中进行排列。当前起始结点只需要和左右两边的两个数字进行比较,计算起始点与左右两个结点相差的距离,选择拥有最短距离的结点,并将当前结点作为起始结点。每一步都是选择当前最优解,符合贪心法的性质。

#include<stdio.h>
#include<stdlib.h>
#include<list>
#define MAX 20
using namespace std;
int n=8;
int start = 53;
int Input[] = {98,183,37,122,14,124,65,67};
list<int>lst;
int sum=0;
struct NodeType{int num;list<int>::iterator position;list<int>best;
};list<int>::iterator shortest;               //暂时存放当前选择的最短结点
void findShort(NodeType &e){int a,b;shortest = e.position;a = abs(e.num-*--shortest);         //计算与左边的路径之差(记得绝对值) shortest = e.position;b = abs(e.num-*++shortest);           //计算与右边的路径之差(记得绝对值) if(e.position!=lst.begin()&&e.position!=--lst.end()){              if(a<b){shortest = e.position;shortest--;sum+=a; }else{shortest = e.position;shortest++;sum+=b;}}else{if(e.position==lst.begin()){     //如果当前结点在开头位置,则不能选择左边的路径 shortest = e.position;shortest++;sum+=b;}if(e.position==--lst.end()){        //如果当前结点在末尾位置,则不能选择右边的路径 shortest = e.position;shortest--;sum+=a;}}printf("当前最小值%d\n",*shortest);printf("当前总路径%d\n",sum);
}void displayBest(NodeType &e){list<int>::iterator b;printf("最短路径:");for(b=e.best.begin();b!=e.best.end();b++){printf("%d ",*b); }printf("\n----------------------------------------------------\n");
}void solve(){NodeType e;e.num = start;lst.push_back(e.num);               //将起始点输入链表 e.best.push_back(e.num);for(int i=0;i<n;i++){lst.push_back(Input[i]);      //将数组输入链表 }lst.sort();  list<int>::iterator it;for(it=lst.begin();it!=lst.end();it++){if(*it == e.num){e.position=it;                      //初始化结点的当前位置
//          printf("%d\n",*it);break;}}
//  printf("整数%d\n",*e.position);while(lst.size()!=1){                       //实在是想不到办法去除最开始的结点53,只能让list长度不为1时循环 printf("当前剩余结点为:");for(it=lst.begin();it!=lst.end();it++){printf("%d ",*it);}printf("\n");findShort(e);e.num = *shortest;e.best.push_back(e.num);lst.erase(shortest);for(it=lst.begin();it!=lst.end();it++){if(*it == e.num){e.position=it;break;}}displayBest(e);}
}
int main(){solve();
}

代码思路解析:

由于需要排序、并动态地删除已经选择过的结点,想到用双链表作为数据的储存结构。
1.先将开始结点与请求序列输入到链表中排好序。
2.找到开始结点,当链表长度不为1时循环(主要是由于暂时找不到方法去除开始结点,如果在前面用list.erase()删除会导致一开始的位置出错…)
3.每次循环寻找最短路径,用左右两边结点之距离比较(注意用上abs()函数),同时计算总路径,注意当前链表迭代器移动到链表头与链表尾时的特殊情况。
4.将最短结点设置为当前结点,储存每次选择过的结点,并删除上次选择的结点。
5.输出最短路径。

总结:

或许有更好的方法去除一开始的结点,
代码也还能再优化一下,但是现在的我只想去推9nine(划掉)。

贪心法求解磁盘驱动调度问题相关推荐

  1. 贪心法求解背包问题 C++

    1.问题描述 背包问题是给定n个重量为{w1, w2,- ,wn}.价值为{v1, v2, - ,vn}的物品和一个容量为C的背包,求这些物品中的一个最有价值的子集,并且要能够装到背包中每次从物品集合 ...

  2. 贪心法求解硬币问题和乘船问题

    贪心算法基本要素: 贪心选择性质:问题的最优解可以通过贪心选择实现(也就是先实现局部最优解,然后整体最优解可以通过一系列局部最优的选择来达到) 最优子结构性质:问题的最优解包含子问题的最优解 贪心算法 ...

  3. java活动安排_贪心法求解活动安排(java实现)

    贪心法描述: 贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择. 在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优 ...

  4. 贪心法求解汽车加油问题

    文章目录 问题内容 贪心法思想 问题分析 代码 结果展示 遇到的问题 问题内容 已知一辆汽车加满油后可行驶d(如d=7)km,而旅途中有若干个加油站.编写一个实验程序指出应在哪些加油站停靠加油,使加油 ...

  5. 分枝限界法求解流水线作业调度问题

    问题描述 有n个作业(编号为1-n)要在由两台机器M1和M2组成的流水线上完成加工.每个作业加工的顺序都是先在M1上加工,然后在M2上加工.M1和M2加工作业i所需的时间分别为ai和bi(1≤i≤n) ...

  6. 基于贪心法及其改进算法求解旅行商问题(附代码)

    旅行商问题 TSP (Traveling Salesman Problem)又称旅行推销员问题是指对于给 定的 n 个城市旅行商从某一城市出发不重复地访问其余每一城市后回到出发的城市 寻找一条使总旅行 ...

  7. 《挑战程序设计竞赛》2.2 贪心法-其它 POJ3617 3069 3253 2393 1017 3040 1862 3262

    POJ3617 Best Cow Line 题意 给定长度为N的字符串S,要构造一个长度为N的字符串T.起初,T是一个空串,随后反复进行下列任意操作: 从S的头部(或尾部)删除一个字符,加到T的尾部 ...

  8. 贪心法——活动安排问题

    贪心法--活动安排问题 贪心法 贪心法的本质可以认为是动态规划在特定条件下的优化.贪心法满足两个性质,最优子结构性质和贪心选择性质. 满足最优子结构性质意味着问题可以被层层分解为子问题,这些子问题构成 ...

  9. 贪心算法求解 TSP 旅行商问题及其实现

    文章目录 一.TSP 概述 1. TSP 2. 数学模型 3. TSP分类 二.贪心算法 1. 算法思路 2. 算法框架 3. 问题 三.贪心算法求解 TSP 一.TSP 概述 1. TSP 旅行商问 ...

最新文章

  1. Python上传磁盘和网络图片,内存图片,使用requests
  2. JS将数字转换为带有单位的中文表示
  3. matlab的讲稿ppt,Matlab初步(讲稿200508)之四
  4. Redis中的主从复制原理
  5. redis异步写入mysql_异步操作redis,mysql
  6. 52次课(mysql用户管理、常用sql语句、 mysql数据库备份恢复)
  7. WiFi生成二维码卡片共享源码
  8. GPU Pro 2 ------ Volume Decals
  9. android全局livedata,Android 使用ViewModel,LiveData高效、简
  10. python高性能_Python高性能分布式执行框架-Ray
  11. html表格左边锁定,表头锁定
  12. IDEA安装及破解永久版教程————鹏鹏
  13. 编译原理及其实践教程(第二版)总结
  14. mac os 10.8.5下 微信开发者工具安装问题
  15. 飞桨框架v2.3 API最新升级!对科学计算、概率分布和稀疏Tensor等提供更全面支持!...
  16. 微信小程序接口文档PHP,微信小程序API 导航
  17. 微信开发之使用第三方图文编辑器
  18. 计算机组成与嵌入式系统 百度云,计算机组成及嵌入式系统.pdf
  19. E - Selling Souvenirs(动态规划 + 贪心 + 思维(缩小时间复杂度和空间复杂度))
  20. 网上邻居无法访问本机及打印机之解…

热门文章

  1. 浪潮(北京)高薪诚聘Linux内核、驱动、虚拟化工程师
  2. matlab eps函数
  3. 【youcans 的 OpenCV 例程200篇】172.SLIC 超像素区域分割算法比较
  4. java 反射调用无参方法_java反射调用方法
  5. java 修饰符默认_Java中的默认访问修饰符是什么?
  6. 用友 LRP计划维护视图
  7. Java可变参数的传参
  8. 如何快速使用 cloudflare CDN 加速
  9. 大话数据结构 第七章 图(二) 最小生成树、最短路径、拓扑排序、关键路径算法
  10. Windows系统下Jenkins安装、配置和使用