版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构DataStructure,第六章优先级队列,第六章优先级队列,基本的优先级队列二叉堆D堆归并优先级队列STL中的优先级队列排队系统的模拟,基本的优先级队列,结点之间的关系是由结点的优先级决定的,而不是由入队的先后次序决定。优先级高的先出队,优先级低的后出队。这样的队列称为优先级队列。,Priorityqueue,Collections.Insertanddeleteitems.Whichitemtodelete?Stack.Removetheitemmostrecentlyadded.Queue.Removetheitemleastrecentlyadded.Randomizedqu
2、eue.Removearandomitem.Priorityqueue.Removethelargest(orsmallest)item.,Priorityqueueapplications,Event-drivensimulation.customersinaline,collidingparticlesNumericalcomputation.reducingroundofferrorDatacompression.HuffmancodesGraphsearching.Dijkstrasalgorithm,PrimsalgorithmNumbertheory.sumofpowersArti
3、ficialintelligence.A*searchStatistics.maintainlargestMvaluesinasequenceOperatingsystems.loadbalancing,interrupthandlingDiscreteoptimization.binpacking,schedulingSpamfiltering.Bayesianspamfilter,Challenge.FindthelargestMfilesinNitemsConstraint.NotenoughmemorytostoreNitems,优先级队列的简单实现,利用现有的队列结构。有两种方法可以
4、处理优先级入队时,按照优先级在队列中寻找合适的位置,将新入队的元素插入在此位置。出队操作的实现保持不变。入队操作的时间复杂度是O(N),出队操作的时间复杂度是O(1)。入队操作的实现保持不变,将新入队的元素放在队列尾。但出队时,在整个队列中查找优先级最高的元素,让它出队。入队操作的时间复杂度是O(1),出队操作的时间复杂度是O(N)。,第六章优先级队列,基本的优先级队列基于树形结构的优先级队列二叉堆D堆归并优先级队列STL中的优先级队列排队系统的模拟,2h-1,2h1,ArrayRepresentation:BTn+1(BT0isnotused),完全二叉树,定义:Abinarytreewit
5、hnnodesandheighthiscompleteiffitsnodescorrespondtothenodesnumberedfrom1tonintheperfectbinarytreeofheighth.,【定理】Ifacompletebinarytreewithnnodesisrepresentedsequentially,thenforanynodewithindexi,1in,wehave:,自然界的完全二叉树,二叉堆,堆是一棵完全二叉树,且满足下述关系之一kik2i且kik2i+1(i=1,2,n/2)或者:kik2i且kik2i+1(i=1,2,n/2)其中,下标是树按层次遍
6、历的次序满足前一条件的称为最小化堆。例如:序列2,3,4,5,7,10,23,29,60是最小化堆满足后一条件的称为最大化堆。例如:序列12,7,8,4,6,5,3,1是最大化堆,最大化堆,最小化堆,二叉堆的特性,结构性:符合完全二叉树的结构有序性:满足父节点小于子节点(最小化堆)或父节点大于子节点(最大化堆)以下的讨论都以最小化堆为例,二叉堆的存储,可以采用顺序存储二叉堆的有序性可以很容易地通过下标来反映,基于二叉堆的优先级队列,如果数值越小,优先级越高,则可以用一个最小化堆存储优先级队列在最小化堆中,最小元素是根元素,而根结点永远存放在数组的下标为1的元素中。获取队头元素的操作就是返回下标
7、为1的数组元素值出队操作就是删除下标为1的数组元素中的值入队操作就是在数组的末尾添加一个元素,但添加后要调整元素的位置,以保持堆的有序性,优先级队列类的定义,templateclasspriorityQueueprivate:intcurrentSize;/队列中元素个数Type*array;/数组的起始地址intmaxSize;/数组的规模voiddoubleSpace();voidbuildHeap();voidpercolateDown(inthole);/向下过滤,public:priorityQueue(intcapacity=100)/创建一个空优先级队列array=newType
8、capacity;maxSize=capacity;currentSize=0;priorityQueue(constTypedata,intsize);/从一组给定的数据创建一个优先级队列priorityQueue()deletearray;boolisEmpty()constreturncurrentSize=0;voidenQueue(constType,enQueue(x),enQueue操作是在堆中插入一个新元素堆的插入是在具有最大序号的元素之后插入新的元素或结点,否则将违反堆的结构性。如果新元素放入后,没有违反堆的有序性,那么操作结束。否则,让该节点向父节点移动,直到满足有序性或到
9、达根节点。新节点的向上移动称为向上过滤(percolateup),在如下的堆中插入元素的过程:,Theonlypossiblepositionforanewnodesinceaheapmustbeacompletebinarytree.,Case1:new_item=21,21,Case2:new_item=17,17,17,20,Case3:new_item=9,9,9,10,enQueue过程,templatevoidpriorityQueue:enQueue(constType,enQueue的时间效率,最坏情况是对数的O(logN)平均情况,过滤会提前结束。有资料表明,平均是2.6次比
10、较,因此元素平均上移1.6层。,DeQueue操作,当最小元素被删除时,在根上出现了一个空结点。堆的大小比以前小1,堆的结构性告诉我们,最后一个结点应该删掉。如果最后一项可以放在此空结点中,就把它放进去。然而,这通常是不可能的。我们必须玩与插入操作相同的游戏:把某些项放入空结点,然后移动空结点。仅有的区别在于:对DeQueue操作,空结点是往下移动。,向下过滤过程,找到空结点的一个较小的子结点,如果该儿子的值小于我们要放入的项,则把该儿子放入空结点,把空结点往下推一层,重复这个动作,直到该项能被放入,删除最小元素,Thenodewhichmustberemovedtokeepacomplete
11、binarytree.,move18uptotheroot,18,findthesmallerchildof18,18,12,18,15,Ah!Thatssimple-weonlyhavetodeletetherootnode.,Andre-arrangetherestofthetreesothatitsstillaminheap.,T(N)=O(logN),deQueue(),templateTypepriorityQueue:deQueue()TypeminItem;minItem=array1;array1=arraycurrentSize-;/将最后一个元素挪到根节点percolate
12、Down(1);/向下过滤returnminItem;,向下过滤,templatevoidpriorityQueue:percolateDown(inthole)intchild;Typetmp=arrayhole;for(;hole*2=currentSize;hole=child)/每次循环下移一层child=hole*2;/child指向左儿子if(child!=currentSize,deQueue操作的性能,因为树有对数的深度,在最坏情况下,deQueue是一个对数时间的操作O(logN)。根据堆的有序性,堆中最后一个结点的值一般都是比较大的。因此,向下过滤很少有提前一或二层结束的,
13、所以deQueue操作平均也是对数时间。,建堆,可以看成N次连续插入,其时间应该是在O(NlogN)时间内完成。事实上,在构造过程中,我们并不关心每个元素加入后堆的状态,我们关心的是N个元素全部加入后的最后状态,最后的状态是要保证堆的有序性。至于中间过程中的有序性是否成立并不重要。有了这个前提后,我们能将构造堆的时间复杂度降到O(N),建堆过程的递归实现,利用堆的递归定义如果函数buildHeap可以将一棵完全二叉树调整为一个堆,那么,只要对左子堆和右子堆递归调用buildHeap。至此,我们能保证除了根结点外,其余的地方都建立起了堆的有序性。然后对根结点调用percolateDown,以创建
14、堆的有序性。,建堆过程的非递归实现,如果我们以逆向层次的次序对结点调用percolateDown,那么在percolateDown(i)被处理时,所有结点i的子孙都已经调用过percolateDown。注意,不需要对叶结点执行percolateDown。因此,我们是从编号最大的非叶结点开始。,templatevoidpriorityQueue:buildHeap()for(inti=currentSize/2;i0;i-)percolateDown(i);currentSize/2:编号最大的非叶结点,带有初始数据的构造函数的实现,templatepriorityQueue:priorityQ
15、ueue(constType*items,intsize):maxSize(size+10),currentSize(size)array=newTypemaxSize;for(inti=0;isize;i+)arrayi+1=itemsi;buildHeap();,10,40,建堆过程,例如,给出的数据初值为40,20,60,15,30,25,10,35,45,50,55,构造一个最小化堆,25,40,60,10,35,60,10,30,25,45,50,55,15,20,20,15,由给出的数据构造一棵完全二叉树,对结点30执行向下过滤,对结点15执行向下过滤,对结点60执行向下过滤,对结
16、点20执行向下过滤,对结点40执行向下过滤,定理:对于一棵高度为h,包含了N=2h+1-1个结点的满二叉树,结点的高度和为Nh1证明:高度为h的结点有一个,高度为h-1的结点有2个,高度为h-2的结点有22个,高度为h-i的节点有2i个。因此,所有节点的高度和为:,建堆的时间代价分析,建堆的时间是O(N)。高度为h的节点(叶节点为0),在percolateDown中交换的最大次数是h。建堆的时间是所有节点的调整时所需交换次数之和,即所有节点的高度之和Nh1。,第六章优先级队列,基本的优先级队列二叉堆D堆归并优先级队列STL中的优先级队列排队系统的模拟,-Allnodeshavedchildre
17、n,Question:Shallwemakedaslargeaspossible?,D-堆,D-堆,每个节点有d个儿子,这样生成的堆比较矮。插入:O(logdN)删除:向下过滤时,需要在d个儿子中找出最小的(O(d),时间复杂度为:O(dlogdN)优点:插入快缺点:删除慢用途:插入比删除多很多的应用优先级队列太大,内存放不下,要放在外存的时候(减少内外存的交换),第六章优先级队列,基本的优先级队列二叉堆D堆归并优先级队列STL中的优先级队列排队系统的模拟,归并优先级队列,二叉堆能有效地支持优先级队列的入队和出队操作,但不能有效地支持两个优先级队列的归并。能有效地支持优先级队列归并的数据结构有
18、左堆斜堆贝努里堆,空路径长度,空路径长度(npl):npl(x)为x到不满两个孩子的节点的最短路径。具有0个或一个孩子的节点的npl为0,npl(NULL)=-1,左堆,左堆:对每个节点x,左孩子的npl不小于右孩子的npl显然,左堆是向左倾斜的堆。满足堆的有序性,但平衡稍弱一些的堆,左堆的主要操作归并,采用递归的方法将根节点稍大的堆与另一个堆的右子树归并如产生的堆违反了左堆的定义,则交换左右子树递归的终止条件:当某个堆为空时,另一个堆就是归并的结果,H1,H2,3,8,10,21,14,23,26,17,6,7,12,18,24,33,18,37,18,8,26,17,左堆的入队和出队操作,
19、入队可以看成是归并的特例。将入队元素看成是指有一个元素的左堆,归并两个左堆就形成了最终的结果。出队操作的实现也很简单。删除了根结点后,这个堆就分裂成两个堆。把这两个堆重新归并起来就是原始的队列中执行出队运算后的结果。,斜堆,斜堆是自调整的左堆。它满足堆的有序性,但不满足堆的结构性。不需要维护npl。因此,右路径可以任意长。最坏的时间复杂性O(N),但对M个连续的操作,最坏的运行时间是O(MlogN)。因此,每个操作由均摊的O(logN)的时间复杂度。它的操作比左堆简单。,斜堆的归并,类似于左堆,只是在左堆中,归并后左右子堆的交换是有条件的;而在斜堆中,是无条件的,必须交换。仅有一种例外情况:右
20、路径上所有节点中的最大者不需要交换它的孩子。,H1,H2,3,8,10,21,14,23,26,17,6,7,12,18,24,33,18,37,18,8,26,17,斜堆的优点,不需要保存npl不需要维护npl不需要测试npl以决定是否要交换左右子堆,贝努里队列,贝努里队列支持插入、删除和归并操作。最坏情况下的时间复杂性是O(logN),但平均的插入时间是一个常量。贝努里队列表示为一个贝努里树的集合。,贝努里树,贝努里树是一棵普通的树,不是二叉树。高度为0的贝努里树是单个节点,高度为k的贝努里树Bk是将一棵Bk-1加到另一棵Bk-1的根上形成的。贝努里树满足堆的有序性,B0,B1,B2,贝努
21、里树Bk的特性,Bk有2k个节点第d层的节点数是贝努里系数,优先级队列的表示,把优先级队列表示为贝努里树的集合。每个高度至多有一棵贝努里树。这样,对于给定的元素个数,这个集合是唯一的,即元素个数的二进制表示中的1的个数。如13个元素,可表示为1101。即该集合由B3、B2和B0组成,六个元素的贝努里队列:,七个元素的贝努里队列:,贝努里队列的操作,归并入队出队,归并操作,由低到高依次归并两个优先级队列中高度相同的树。如果由于前一次归并而出现三棵高度相同的树时,留下一棵,归并其余两棵。高度相同的树的归并:将根节点大的作为根节点小的树的子树。归并的时间效益:N个元素的队列有logN棵树,因此最坏情
22、况为O(logN)。,归并以下两个队列:,14,26,23,51,24,65,13,16,18,12,21,24,65,H1,H2,归并B0:由于只有H2有B0,所以无需归并归并B1:形成以下的树,14,26,16,18,现在有三棵B2,留下一棵,归并其余两棵,最后的队列:,插入,插入是归并的特例为被插入节点形成一棵单节点的树组成的集合,归并两个集合时间效益:最坏情况为O(logN),相当于二进制加法中的加1,但每次都有进位的情况。一般进位进到中间的某一位会终止。即当原先集合中缺少Bi时,则归并i次,由于每棵树的出现是等概率的,因此平均归并两次就能结束。,删除,找出具有最小根值的树T将T从原先
23、的集合中删掉在T中删除根节点归并T与原先的集合,在以下的队列中删除最小元素:,13,12,21,24,65,14,26,16,18,最小元素出现在B3中,删除最小元素12,形成下列森林:,归并两个森林:,13,21,24,65,14,26,16,18,贝努里队列的存储,每棵树看成是有序树,采用标准的树的存储方式孩子兄弟链的表示法整个森林表示成一个指向树根的指针的线性表,13,12,21,24,65,14,26,16,18,如下的贝努里队列可表示成:,13,23,24,51,65,12,21,24,65,14,26,16,18,贝努里队列的时间性能,归并:N个元素的队列至多有logN棵树,每两棵
24、树的归并只需要常量的时间。因此最坏情况的时间复杂度为O(logN)。但可以证明平均情况的时间复杂度是常量的。入队操作的平均时间复杂度是O(1)的出队操作:首先在队列中找出根结点值最小的树。这需要花费O(logN)的时间。然后又要归并两个优先级队列,又需要O(logN)的时间。所以删除操作的时间复杂度是O(logN)的,第六章优先级队列,基本的优先级队列二叉堆D堆归并优先级队列STL中的优先级队列排队系统的模拟,STL中的优先级队列,头文件:queue类模版:priority_queue实现方式:二叉堆主要成员:Voidpush(constObjectintmain()priority_queu
25、eq;/最大化堆,第2、3参数可缺省q.push(10);q.push(1);q.push(5);q.push(8);q.push(0);q.push(4);q.push(9);q.push(7);q.push(3);q.push(6);q.push(2);while(!q.empty()cout,greaterq;/最小化堆,第六章优先级队列,基本的优先级队列二叉堆D堆归并优先级队列STL中的优先级队列排队系统的模拟,单服务台的排队系统,在单服务台系统中,先到达的顾客先获得服务,也肯定先离开。到达和离开的次序是一致的。事件处理的次序是:顾客1到达、顾客1离开、顾客2到达、顾客2离开、顾客n到
26、达、顾客n离开顾客离开顺序和到达顺序一致。只需要一个普通队列保存顾客到达信息,多服务台的排队系统,在多服务台系统中,先到达的顾客先获得服务,但后获得服务的顾客可能先离开;事件处理的次序可能是:顾客1到达、顾客2到达、顾客2离开、顾客3到达、顾客1离开、顾客3离开、顾客n到达、顾客n离开、发生时间早的事件先处理,发生时间晚的事件后处理。因而需要一个优先级队列存放事件。事件的优先级就是发生的时间,多服务台的排队系统模拟,产生CustomNum个顾客的到达事件,按时间的大小存入事件队列;置初值置等待队列为空;置所有柜台为空闲;设置等待时间为0;模拟器开始处理事件:从队列中取出一个事件。这是第一个顾客
27、的到达事件。生成所需的服务时间。当前时间加上这个服务时间就是这个顾客的离开时间。生成一个在这个时候离开的事件,插入到事件队列。同样模拟器从队列中取出的事件也可能是离开事件,这时只要将这个离开事件从队列中删去,为他服务的服务台变成了空闲状态,可以继续为别的顾客服务。,模拟类的定义,classsimulatorintnoOfServer;/服务台个数intarrivalLow;/到达间隔时间的下界intarrivalHigh;/到达间隔时间的上界intserviceTimeLow;/服务间隔时间的下界intserviceTimeHigh;/服务间隔时间的上界intcustomNum;/模拟的顾客数
28、structeventTinttime;/事件发生时间inttype;/事件类型。0为到达,1为离开booloperator(consteventT,构造函数的实现,simulator:simulator()coutnoOfServer;coutarrivalLowarrivalHigh;coutserviceTimeLowserviceTimeHigh;coutcustomNum;srand(time(NULL);/随机数发生器的初始化,avgWaitTime(),intsimulator:avgWaitTime()intserverBusy=0;/正在工作的服务台数intcurrentTi
29、me;/记录模拟过程中的时间inttotalWaitTime=0;/模拟过程中所有顾客的等待时间的总和linkQueuewaitQueue;/顾客等待队列priorityQueueeventQueue;/事件队列eventTcurrentEvent;/当前事件,/产生customNum个顾客的到达事件,按到达时间大小入队,生成初始的事件队列inti;currentEvent.time=0;currentEvent.type=0;for(i=0;icustomNum;+i)currentEvent.time+=arrivalLow+(arrivalHigh-arrivalLow+1)*rand(
30、)/(RAND_MAX+1);eventQueue.enQueue(currentEvent);,/模拟过程while(!eventQueue.isEmpty()/事件队列非空currentEvent=eventQueue.deQueue();/出队currentTime=currentEvent.time;/设置当前时间为该事件发生的时间switch(currentEvent.type)case0:处理到达事件break;case1:处理离开事件/switch结束/while结束returntotalWaitTime/customNum;,处理到达事件,if(serverBusy!=noOf
31、Server)/有空闲服务台+serverBusy;currentEvent.time+=serviceTimeLow+(serviceTimeHigh-serviceTimeLow+1)*rand()/(RAND_MAX+1);/设置事件发生时间为当前时间加上服务时间currentEvent.type=1;/修改事件类型为离开eventQueue.enQueue(currentEvent);/重新放入事件队列elsewaitQueue.enQueue(currentEvent);/事件放入等待队列,处理离开事件,if(!waitQueue.isEmpty()/等待队列非空currentEve
32、nt=waitQueue.deQueue();/出队totalWaitTime+=currentTime-currentEvent.time;/统计等待时间currentEvent.time=currentTime+serviceTimeLow+(serviceTimeHigh-serviceTimeLow+1)*rand()/(RAND_MAX+1);/设置事件发生时间为当前时间加上服务时间currentEvent.type=1;/修改事件类型为离开eventQueue.enQueue(currentEvent);/重新放入事件队列else-serverBusy;/空闲柜台数加1,simul
33、ator类的使用,intmain()simulatorsim;cout平均等待时间:sim.avgWaitTime()endl;return0;,某次执行结果,请输入柜台数:4请输入到达时间间隔的上下界(最小间隔时间最大间隔时间):02请输入服务时间的上下界(服务时间下界服务时间上界):27请输入模拟的顾客数:1000平均等待时间:61,总结,优先级队列是程序设计中常用的一个工具。本章介绍了一种优先级队列的优秀的实现方法二叉堆。还介绍了一些能够实现优先级队列归并的堆的概念最后。介绍了优先级队列的一个重要应用,即多服务台的排队系统的模拟。,作业,程序设计题:5、7、8题,Moleculardyn
34、amicssimulationofharddiscs,Goal.SimulatethemotionofNmovingparticlesthatbehaveaccordingtothelawsofelasticcollision.Harddiscmodel.Movingparticlesinteractviaelasticcollisionswitheachotherandwalls.Eachparticleisadiscwithknownposition,velocity,mass,andradius.Nootherforces.Significance.Relatesmacroscopico
35、bservablestomicroscopicdynamics.Maxwell-Boltzmann:distributionofspeedsasafunctionoftemperature.Einstein:explainBrownianmotionofpollengrains.,temperature,pressure,diffusionconstant,motionofindividualatomsandmolecules,Time-drivensimulation,Discretizetimeinquantaofsizedt.Updatethepositionofeachparticle
36、aftereverydtunitsoftime,andcheckforoverlaps.Ifoverlap,rollbacktheclocktothetimeofthecollision,updatethevelocitiesofthecollidingparticles,andcontinuethesimulation.,Time-drivensimulation,Maindrawbacks.N2/2overlapcheckspertimequantum.Simulationistooslowifdtisverysmall.Maymisscollisionsifdtistoolarge.(ifcollidingparticlesfailtooverlapwhenwearelooking),Event-drivensimulation,Changestateonlywhensomethinghappens.Betweencollisions,particlesmoveinstraight-linetrajectories.Focusonlyontimeswhencollisionsoccur.Maintainpriorityqueues(PQ)ofcollisionevents,prioritized
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026全国计算机二级考试题及答案
- 2026年交安三类c证考试题型及答案
- 2026年银行私人银行岗招聘考试笔试试题(含答案)
- 水库淹没区及移民安置土地复垦方案报告书
- 2026年疾控中心地方病防制科招聘试题及答案
- 生态旅游度假区项目使用林地可行性报告
- 农业项目水土保持方案报告
- 2025安全生产管理人员题库及答案
- 2025华夏银行西安分行校园招聘笔试历年典型考题及考点剖析附带答案详解
- 2025北京烁科中科信校园招聘笔试历年典型考点题库附带答案详解
- 江苏省兴化市顾庄学区2026届中考数学五模试卷含解析
- 2026年中国临床肿瘤学会结直肠癌诊疗指南版
- 2025年湖南省技术产权交易所有限责任公司专业岗位招聘4人笔试参考题库附带答案详解
- AI赋能下北师大版小学数学四年级上册《确定位置》教学设计反思
- 11080《工程数学》国家开放大学期末考试题库
- 2025新疆机场(集团)有限责任公司喀什管理分公司第一季度招笔试备考试题附答案
- 雨课堂学堂在线学堂云《临床流行病学(山东大学)》单元测试考核答案
- 工厂化学品使用安全培训
- 棋牌室场所安全管理制度
- 江苏浩凯丰水力发电科技股份有限公司介绍企业发展分析报告模板
- 电机更换施工方案
评论
0/150
提交评论