




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1第6章队列(QUEUES)2本章内容6.1抽象数据类型6.2公式化描述6.3链表描述6.4应用2/6/20233队列的实现队列的应用本章重点46.4应用6.4.1火车车厢重排6.4.2电路布线6.4.3图元识别6.4.4工厂仿真56.4.1火车车厢重排缓冲铁轨位于入轨和出轨之间入轨右端->缓冲铁轨入轨右端->出轨缓冲铁轨右端->出轨
禁止
:将车厢从缓冲铁轨移动至入轨从出轨移动车厢至缓冲铁轨铁轨Hk为可直接将车厢从入轨移动到出轨的通道6车厢移动到缓冲铁轨的原则车厢c应移动到这样的缓冲铁轨中:该缓冲铁轨中现有各车厢的编号均小于c;如果有多个缓冲铁轨都满足这一条件,则选择一个左端车厢编号最大的缓冲铁轨;否则选择一个空的缓冲铁轨(如果有的话)。2/6/20237从前至后依次检查入轨上的所有车厢。如果正在检查的车厢就是下一个满足排列要求的车厢,可以直接把它放到出轨上去。如果不是,则把它移动到缓冲铁轨上,直到按输出次序要求轮到它时才将它放到出轨上。重排演示。火车车厢重排方案8火车车厢重排思路intNowOut=1;//NowOut:下一次要输出的车厢号for(inti=1;i<=n;i++)//从前至后依次检查的所有车厢{1.车厢p[i]从入轨上移出2.If(p[i]==NowOut)//NowOut:下一次要输出的车厢号①使用缓冲铁轨Hk把p[i]放到出轨上去;NowOut++;②while(minH(当前缓冲铁轨中编号最小的车厢)==NowOut){把minH放到出轨上去;
更新minH,minQ(minH所在的缓冲铁轨);NowOut++;}else按照分配规则将车厢p[i]送入某个缓冲铁轨}读程序
6-76-82/6/20239boolRailroad(intp[],intn,intk){//k个缓冲铁轨,车厢初始排序为p[1:n]//如果重排成功,返回true,否则返回false//如果内存不足,则引发异常NoMem。//创建与缓冲铁轨对应的堆栈LinkedQueue<int>*H;H=newLinkedQueue<int>[k];k--;intNowOut=1;//下一次要输出的车厢intminH=n+l;//缓冲铁轨中编号最小的车厢intminQ;//minH号车厢对应的缓冲铁轨火车车厢重排程序-队列2/6/202310//车厢重排for(inti=1;i<=n;i++) if(p[i]==NowOut){//直接输出t cout<<“将车厢”<<p[i]<<“从入轨移至出轨"<<endl;
NowOut++; //从缓冲铁轨中输出
while(minH==NowOut){
Output(minH,minQ,H,k,n); NowOut++; } }else{//将p[i]送入某个缓冲铁轨
if(!Hold(p[i],minH,minQ,H,k)) returnfalse;}returntrue;}火车车厢重排程序2/6/202311voidOutput(int&minH,int&minQ,LinkedQueue<int>H[],intk,intn){//从缓冲铁轨移动到出轨,并修改minH和minQ. intc;//车厢编号
//从队列minQ中删除编号最小的车厢minH
H[minQ].Delete(c); cout<<"Movecar"<<minH<<"fromholdingtrack"<<minQ<<"tooutput"<<endl; //通过检查所有队列的首部,寻找新的minH和minQ minH=n+2; for(inti=1;i<=k;i++) if(!H[i].IsEmpty()&&c=H[i].First())<minH){ minH=c; minQ=i;}}Output函数2/6/202312boolHold(intc,int&minH,int&minQ,LinkedQueue<int>H[],intk){//把车厢c移动到缓冲铁轨中//如果没有可用的缓冲铁轨,则返回false,否则返回true//为车厢c寻找最优的缓冲铁轨//初始化intBestTrack=0,//目前最优的铁轨
BestLast=0,//BestTrack中最后一节车厢
x;//车厢编号Hold函数2/6/202313//扫描缓冲铁轨for(inti=1;i<=k;i++) if(!H[i].IsEmpty()){//铁轨i不为空
x=H[i].Last(); if(c>x&&x>BestLast){//铁轨i尾部的车厢编号较大
BestLast=x; BestTrack=i;} }else//铁轨i为空
if(!BestTrack)BestTrack=i;Hold函数2/6/202314if(!BestTrack)returnfalse;//没有可用的铁轨//把c移动到最优铁轨H[BestTrack].Add(c);cout<<"Movecar"<<c<<"frominput"<<"toholdingtrack"<<BestTrack<<endl;//如果有必要,则修改minH和minQif(c<minH){minH=c;minQ=BestTrack;}returntrue;}复杂性?Hold函数2/6/202315在迷宫中寻找最短路径的问题也存在于其他许多领域。例如,在解决电路布线问题时,一种很常用的方法就是在布线区域叠上一个网格,该网格把布线区域划分成n×m个方格,就像迷宫一样。从一个方格a的中心点连接到另一个方格b的中心点时,转弯处必须采用直角。如果已经有某条线路经过一个方格,则封锁该方格。我们希望使用a和b之间的最短路径来作为布线的路径,以便减少信号的延迟。6.4.2迷宫最短路径问题扩展2/6/202316电路布线2/6/202317为了找到网格中位置a和b之间的最短路径,先从位置a开始搜索,把a可到达的相邻方格都标记为1(表示与a相距为1)然后把标号为1的方格可到达的相邻方格都标记为2(表示与a相距为2)继续进行下去直到到达b或者找不到可到达的相邻方格为止。方案2/6/202318方案演示2/6/202319为了得到a与b之间的最短路径,从b开始首先移动到一个比b的编号小的相邻位置上。一定存在这样的相邻位置,因为任一个方格上的标号与它相邻方格上的标号都至少相差1。接下来,从当前位置开始,继续移动到比当前标号小1的相邻位置上。重复这个过程,直至到达a为止。输出方案2/6/202320boolFindPath(Positionstart,Positionfinish,int&PathLen,Position*&path){//寻找从start到finish的路径//如果成功,则返回true,否则返回false//如果空间不足,则引发异常NoMemif((start.row==finish.row)&&(start.col==finish.col)) {PathLen=0;returntrue;}//start=finish//初始化包围网格的“围墙”for(inti=0;i<=m+1;i++){ grid[0][i]=grid[m+1][i]=1;//底和顶
grid[i][0]=grid[i][m+1]=1;//左和右}寻找电路布线最短路径2/6/202321//初始化offsetPositionoffset[4];offset[0].row=0;offset[0].col=1;//右offset[1].row=1;offset[1].col=0;//下offset[2].row=0;offset[2].col=-1;//左offset[3].row=-1;offset[3].col=0;//上intNumOfNbrs=4;//一个网格位置的相邻位置数Positionhere,nbr;here.row=start.row;here.col=start.col;grid[start.row][start.col]=2;//封锁寻找电路布线最短路径2/6/202322//标记可到达的网格位置LinkedQueue<Position>Q;do{//标记相邻位置
for(inti=0;i<NumOfNbrs;i++){ nbr.row=here.row+offset[i].row; nbr.col=here.col+offset[i].col; if(grid[nbr.row][nbr.col]==0){//新位置
grid[nbr.row][nbr.col]=grid[here.row][here.col]+1; if((nbr.row==finish.row)&&(nbr.col==finish.col)) break;//完成
Q.Add(nbr);}//if结束
}//for结束寻找电路布线最短路径2/6/202323 //已到达finish吗? if((nbr.row==finish.row)&& (nbr.col==finish.col)) break;//完成
//未到达finish,可移动到nbr吗? if(Q.IsEmpty())returnfalse;//没有路径
Q.Delete(here);//到下一位置}while(true);寻找电路布线最短路径电路布线过程-队列状态2/6/2023243,34,23,12,2rearfront
4,23,12,2rearfront
3,44,33,12,2front
3,44,3rear5,24,12,2front
3,44,3rear5,24,12,1front
3,44,3rear5,24,12,11,2电路布线过程-队列状态2/6/202325front
4,3rear5,24,12,11,2front
rear5,24,12,11,25,3front
rear4,12,11,25,3front
rear2,11,25,3front
rear1,25,31,1电路布线过程-队列状态2/6/202326front
rear5,31,1front
rear1,15,4front
rear5,4front
rear6,4front
rear6,57,4电路布线过程-队列状态2/6/202327front
rear7,46,67,5front
rear6,67,5front
rear7,56,77,65,6front
rear6,77,65,6front
rear7,65,67,75,7电路布线过程-队列状态2/6/202328front
rear5,67,75,7front
rear7,75,7(nbr.row==finish.row)&&(nbr.col==finish.col)寻找电路布线最短路径2/6/2023291、从b开始,首先移动到一个比b的编号小的相邻位置上。可从b移动到(5,6)2、从当前位置开始,继续移动到比当前标号小1的相邻位置上,重复这个过程,直至到达a为止。(5,6),(6,6),(6,4),(5,4),…(3,2)。2/6/202330//构造路径PathLen=grid[finish.row][finish.col]-2;path=newPosition[PathLen];here=finish;//回溯至finishfor(intj=PathLen-1;j>=0;j--){ path[j]=here; //寻找前一个位置
for(inti=0;i<NumOfNbrs;i++){ nbr.row=here.row+offset[i].row; nbr.col=here.col+offset[i].col; if(grid[nbr.row][nbr.col]==j+2)break; }
here=nbr;//移动到前一个位置
}returntrue;}寻找电路布线最短路径电路布线复杂度分析网格编号过程需耗时O(m2)重构路径的过程需耗时Q(PathLen)2/6/2023312/6/202332数字化图像是一个m×m的像素矩阵。单色图像中,每个像素的值要么为0,要么为1。值为0的像素表示图像的背景,而值为1的像素则表示图元上的一个点,我们称其为图元像素。如果一个像素在另一个像素的左侧、上部、右侧或下部,则称这两个像素为相邻像素。识别图元就是对图元像素进行标记,当且仅当两个像素属于同一图元时,它们的标号相同。6.4.3识别图元识别图元2/6/2023332/6/202334一间工厂由m台机器组成。工厂中所执行的每项任务都由若干道工序构成,一台机器用来完成一道工序,不同的机器完成不同的工序。一旦一台机器开始处理一道工序,它会连续不断地进行处理,直到该工序被完成为止。6.4.4工厂仿真2/6/202335对于一项任务中的每道工序来说,都有两个属性:一是工时(即完成该道工序需要多长时间),一是执行该工序的机器。一项任务中的各道工序必须按照一定的次序来执行。一项任务的执行是从处理第一道工序的机器开始的,当第一道工序完成后,任务转至处理第二道工序的机器,依此进行下去,直到最后一道工序完成为止。当一项任务到达一台机器时,若机器正忙,则该任务将不得不等待。工序属性2/6/202336在工厂中每台机器都可以有如下三种状态:活动、空闲和转换。在活动状态,机器正在处理一道工序。在空闲状态机器无事可做。在转换状态,机器刚刚完成一道工序,并在为一项新任务的执行做准备,比如机器操作员可能需要清理机器并稍作休息等。每台机器在转换状态期间所花费的时间可能各不相同。机器状态2/6/202337当一台机器可以处理一项新任务时,它可能需要从各个等待者中挑选一项任务来执行。在这里,每台机器都按照FIFO的方式来处理等待者,因此每台机器旁的等待者构成了一个FIFO队列。在其他类型的工厂中,可以为每项任务指定不同的优先权,当机器变成空闲时,从等待者中首先选择具有最高优先权的任务来执行。任务队列2/6/202338为了让顾客满意,希望尽量减少任务在机器队列中的等待时间。如果能够知道每项
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 国内海洋工程船舶维修标准合同范文
- 涂料销售合同协议
- 冷冻仓储设施扩建项目合同书
- 保险代理业务合同管理规定
- Module 10 Unit 2 You shouldn't be late(教学设计)-2024-2025学年外研版(一起)英语五年级上册
- 深圳经济特区建筑工程合同
- 数据中心改造工程承包合同书
- 未来合同样本:维保合同智能化变革之路
- 租期到期商铺租赁合同终止合同模板
- 度资产重组股权转让合同
- DZ∕T 0289-2015 区域生态地球化学评价规范(正式版)
- 2020年5月天津高考英语听力试题-(试题+MP3+答案)-
- DB32T 4400-2022《饮用水次氯酸钠消毒技术规程》
- 学校校园禁烟处罚管理方案
- 少儿美术教育知识讲座
- 外科学教学课件:颈、腰椎退行性疾病
- 2023-2024届高考语文复习小说训练(含答案)-孙犁《风云初记》
- 中医培训课件:《拔罐技术》
- 取节育环之后的护理
- 2023年12月东莞市樟木头镇下属事业单位2024年公开招考4名特聘工程师笔试历年高频考题(难、易错点荟萃)答案带详解附后
- 河南文旅行业分析
评论
0/150
提交评论