高级数据结构PPT课件.ppt
《高级数据结构PPT课件.ppt》由会员分享,可在线阅读,更多相关《高级数据结构PPT课件.ppt(378页珍藏版)》请在三一文库上搜索。
1、高级数据结构高级数据结构 教材:教材:数据结构(数据结构(C+描述)描述)(金远平编著,清华大(金远平编著,清华大学出版社)学出版社)讲课教师:讲课教师:金远平,软件学院金远平,软件学院 1JYP代价分摊(代价分摊(1.5.4)将孤立地分析一次算法调用得出的结论应用于一将孤立地分析一次算法调用得出的结论应用于一个个ADT的相关操作序列会产生过于悲观的结果。的相关操作序列会产生过于悲观的结果。例例1.12 整数容器整数容器Bag。class Bag public:Bag(int MaxSize=DefaultSize);/假设DefaultSize已定义 int Add(const int x)
2、/将整数x加入容器中 int Delete(const int k);/从容器中删除并打印k 个整数private:int top;/指示已用空间 int*b;/用数组b存放整数 int n;/容量;2JYP各操作的实现如下:各操作的实现如下:Bag:Bag(int MaxSize=DefaultSize):n(MaxSize)b=new intn;top=-1;int Bag:Add(const int x)if(top=n-1)return 0;/返回0表示加入失败 else b+top=x;return 1;3JYPint Bag:Delete(const int k)if(top+1
3、 k)return 0;/容器内元素不足容器内元素不足k k个,删除失个,删除失败败 else for(int i=0;i k;i+)cout btop i “”;top=top-k;return 1;先分析操作成功的情况:先分析操作成功的情况:Add(x)的时间复杂性的时间复杂性是是O(1);Delete(k)需要需要k个程序步,且个程序步,且k可能等于可能等于n,在最坏情况下其时间复杂性是在最坏情况下其时间复杂性是O(n);一个调用;一个调用Add操作操作 m1次,次,Delete操作操作m2次的序列的总代价则为次的序列的总代价则为O(m1+m2n)。4JYP 前面是常规分析的结论。进一步
4、观察:如果一开前面是常规分析的结论。进一步观察:如果一开始容器为空,则删除的元素不可能多于加入的元素,始容器为空,则删除的元素不可能多于加入的元素,即即 m2 次次Delete操作的总代价不可能大于操作的总代价不可能大于m1 次次Add操作的总代价。因此,在最坏情况下,一个调用操作的总代价。因此,在最坏情况下,一个调用Add操作操作 m1次,次,Delete操作操作m2次的序列的总代价为次的序列的总代价为O(m1)。操作失败时,操作失败时,Add(x)和和Delete(k)的时间复杂性的时间复杂性都是都是O(1)。因此,在操作可能失败的情况下,一个。因此,在操作可能失败的情况下,一个调用调用A
5、dd操作操作 m1次,次,Delete操作操作m2次的序列的总代次的序列的总代价为价为O(m1+m2)。5JYP 常规分析并没有错,只是其推导出的总代价上常规分析并没有错,只是其推导出的总代价上界远大于实际可得的上界。其原因是这种分析法没界远大于实际可得的上界。其原因是这种分析法没有注意到连续的最坏情况删除是不可能的。有注意到连续的最坏情况删除是不可能的。为了取得更准确的结果,还应该度量为了取得更准确的结果,还应该度量ADT数据数据结构的状态。对于每一个可能的状态结构的状态。对于每一个可能的状态S,赋予一个实,赋予一个实数数(S)。(S)称为称为S的的势能势能,其选择应使得,其选择应使得(S)
6、越高,越高,对处于对处于S状态的数据结构成功进行高代价操作的可能状态的数据结构成功进行高代价操作的可能越大。越大。例如,将容器元素个数作为容器状态的势能就例如,将容器元素个数作为容器状态的势能就很合理,因为元素越多,对容器成功进行高代价操很合理,因为元素越多,对容器成功进行高代价操作的可能越大。作的可能越大。6JYP 考虑一个由考虑一个由m个对个对ADT操作的调用构成的序列,操作的调用构成的序列,并设并设ti是第是第i次调用的次调用的实际代价实际代价,定义第,定义第i次调用的次调用的分分摊代价摊代价ai为为ai=ti+(Si)(Si-1)Si-1是第是第i次调用开始前次调用开始前ADT数据结构
7、的状态,数据结构的状态,Si是第是第i次调用结束后次调用结束后ADT数据结构的状态。设数据结构的状态。设 的选的选择使得择使得(Sm)(S0),则,则7JYP即,分摊代价的总和是实际代价总和的上界。即,分摊代价的总和是实际代价总和的上界。例例1.12将容器元素个数作为将容器元素个数作为(S)。若操作序列始。若操作序列始于空容器,则于空容器,则(Sm)(S0)总是成立。下表反映了总是成立。下表反映了容器容器(S)的典型变化情况。的典型变化情况。8JYP 对对于于Add操操作作,ti=1,(Si)(Si-1)=1,所所以以ai=2;对对于于Delete操操作作,ti=k,(Si)(Si-1)=k,
8、所以,所以ai=0。任任何何一一个个调调用用Add操操作作 m1次次,Delete操操作作m2次次的的序列的总代价为序列的总代价为O(m1 2+m2 0)=O(m1)。9JYP 可可见见,分分摊摊分分析析法法将将偶偶尔尔出出现现的的高高价价操操作作调调用用的的代价代价分摊分摊到邻近的其它调用上,故而得名。到邻近的其它调用上,故而得名。而而且且,当当用用分分摊摊分分析析法法得得到到的的一一个个操操作作调调用用序序列列的的代代价价总总和和比比用用常常规规分分析析法法得得到到的的代代价价总总和和小小时时,人人们们就就得得到到了了更更接接近近实实际际代代价价的的分分析析结结果果,或或者者说说对算法时间
9、复杂性的判断对算法时间复杂性的判断更准确更准确了。了。10JYP两个字符串的最长公共子序列(两个字符串的最长公共子序列(2.4.3)一个字符串的子序列通过从字符串中删除零或多一个字符串的子序列通过从字符串中删除零或多个任意位置的字符得到。个任意位置的字符得到。两个字符串两个字符串x和和y的的最长公共子序列最长公共子序列记为记为lcs(x,y)。例如,例如,x=abdebcbb,y=adacbcb,则,则lcs(x,y)是是adcbb和和adbcb,如下所示:,如下所示:11JYP问题的基本求解方法问题的基本求解方法:用用 标记空串,则标记空串,则lcs(x,)=lcs(,y)=。lcs(xa,
10、ya)=lcs(x,y)a,即,即xa和和ya的最长公共子序的最长公共子序列由列由x和和y的最长公共子序列后接的最长公共子序列后接a构成。构成。若若xa和和yb的最后一个字符不相等,则当的最后一个字符不相等,则当lcs(xa,yb)不以不以a结尾时一定等于结尾时一定等于lcs(x,yb),当,当lcs(xa,yb)不不以以b结尾时一定等于结尾时一定等于lcs(xa,y)。因此。因此lcs(xa,yb)等于等于 lcs(x,yb)与与 lcs(xa,y)中较长者。中较长者。12JYP 由此可得计算两个字符串最长公共子序列长度的由此可得计算两个字符串最长公共子序列长度的递归算法递归算法lcs:in
11、t String:lcs(String y)/驱动器 int n=Length(),m=y.Length();return lcs(n,m,y.str);int String:lcs(int i,int j,char*y)/递归核心 if(i=0|j=0)return 0;if(stri-1=yj-1)return(lcs(i-1,j-1,y)+1);return max(lcs(i-1,j,y),lcs(i,j-1,y);13JYP 设设x的长度为的长度为n,y的长度为的长度为m,在最坏情况下,在最坏情况下lcs的时间复杂性为的时间复杂性为w(n,m)。w(n,m)=因此,因此,w(n,m)
12、2 w(n-1,m-1)2min(n,m)c,即,即lcs的时间复杂性是指数型的。的时间复杂性是指数型的。进一步可发现,进一步可发现,lcs(i,0)=0(0in),),lcs(0,j)=0(0jm)。)。lcs(i,j)的计算依赖于的计算依赖于lcs(i1,j1)、lcs(i1,j)和和lcs(i,j1),如下图所示:,如下图所示:c(c为常数)为常数)n=0或或m=0w(n,m-1)+w(n-1,m)否则否则14JYP 根据以上拓扑关系,可以在不用递归的情况下计根据以上拓扑关系,可以在不用递归的情况下计算算lcs(i,j)。算法。算法Lcs实现了上述优化策略,这种策略实现了上述优化策略,这
13、种策略体现了动态规划的思想。算法体现了动态规划的思想。算法Lcs的时间复杂性显然的时间复杂性显然是是O(n m),这比其递归版有很大改进。,这比其递归版有很大改进。15JYPint String:Lcs(String y)int n=Length(),m=y.Length();int lcsMaxNMaxM;/MaxN和MaxM 是已定义的常数 int i,j;for(i=0;i=n;i+)lcsi0=0;/初始值 for(j=0;j=m;j+)lcs0j=0;/初始值 for(i=1;i=n;i+)for(j=1;j=m;j+)if(stri-1=y.strj-1)lcsij=lcsi-1j
14、1+1;else lcsij=max(lcsi-1j,lcsij-1);return lcsnm;16JYP 例如,例如,x=abdebcbb,y=adacbcb,lcs(x,y)=adbcb,改,改进算法的计算如下所示:进算法的计算如下所示:7012223455601222344450122233444011222333301122222220112222221011111111000000000001234567817JYP机场模拟(机场模拟(2.9)计算机模拟(计算机模拟(simulation):):用软件模仿另一个系统的行为。用软件模仿另一个系统的行为。将研究对象表示为数据结构,对象
15、动作表示为对将研究对象表示为数据结构,对象动作表示为对数据的操作,控制动作的规则转换为算法。数据的操作,控制动作的规则转换为算法。通过更改数据的值或改变算法设置,可以观察到通过更改数据的值或改变算法设置,可以观察到计算机模拟的变化,从而使用户能够推导出关于计算机模拟的变化,从而使用户能够推导出关于实际系统行为的有用结论。实际系统行为的有用结论。在计算机处理一个对象的动作期间,其它对象和在计算机处理一个对象的动作期间,其它对象和动作需等待。动作需等待。队列在计算机模拟中具有重要应用。队列在计算机模拟中具有重要应用。18JYP简单机场模拟:简单机场模拟:只有一个跑道。只有一个跑道。在每个时间单元,
16、可起飞或降落一架飞机,但不在每个时间单元,可起飞或降落一架飞机,但不可同时起降。可同时起降。飞机准备降落或起飞的时间是随机的,在任一时飞机准备降落或起飞的时间是随机的,在任一时间单元,跑道可能处于空闲、降落或起飞状态,间单元,跑道可能处于空闲、降落或起飞状态,并且可能有一些飞机在等待降落或起飞。并且可能有一些飞机在等待降落或起飞。飞机在地上等待的代价比在空中等待的小,只有飞机在地上等待的代价比在空中等待的小,只有在没有飞机等待降落的情况下才允许飞机起飞。在没有飞机等待降落的情况下才允许飞机起飞。当出现队列满的情况时,则拒绝为新到达的飞机当出现队列满的情况时,则拒绝为新到达的飞机服务。服务。19
17、JYP需要两个队列需要两个队列landing和和takeoff。飞机可描述为:飞机可描述为:struct plane int id;/编号 int tm;/到达队列时间;飞机的动作为:飞机的动作为:enum action ARRIVE,DEPART;20JYP模拟运行模拟运行:时间单元时间单元:1 endtime,并产生关于机场行为的,并产生关于机场行为的重要统计信息,如处理的飞机数量,平均等待时重要统计信息,如处理的飞机数量,平均等待时间,被拒绝服务飞机的数量等。间,被拒绝服务飞机的数量等。采用基于泊松分布的随机整数决定在每个时间单采用基于泊松分布的随机整数决定在每个时间单元有多少架新飞机需
18、要降落或起飞。元有多少架新飞机需要降落或起飞。假设在假设在10个时间单元中到达的飞机数分别是:个时间单元中到达的飞机数分别是:2,0,0,1,4,1,0,0,0,1,那么每个时间单元,那么每个时间单元的平均到达数是的平均到达数是0.9。21JYP 一个非负整数序列满足给定期望值一个非负整数序列满足给定期望值v v的泊松分布的泊松分布意味着,对于该序列的一段足够长的子序列,其意味着,对于该序列的一段足够长的子序列,其中整数的平均值接近中整数的平均值接近v v。在模拟中还需要建立新到达飞机的数据,处理被在模拟中还需要建立新到达飞机的数据,处理被拒绝服务的飞机,起飞、降落飞机,处理机场空拒绝服务的飞
19、机,起飞、降落飞机,处理机场空闲和总结模拟结果。闲和总结模拟结果。下面是机场模拟类定义:下面是机场模拟类定义:22JYPclass AirportSimulation/机场模拟。一个时间单元=起飞或降落的时间public:AirportSimulation();/构造函数 void RunSimulation();/模拟运行private:Queue landing(6);/等待降落飞机队列,假设用环/型队列,实际长度为5 Queue takeoff(6);/等待起飞飞机队列,同上 double expectarrive;/一个时间单元内期望到达降落飞机数 double expectdepar
20、t;/一个时间单元内期望到达起飞飞机数 int curtime;/当前时间 int endtime;/模拟时间单元数 int idletime;/跑道空闲时间单元数 int landwait;/降落飞机的总等待时间23JYP int nland;/降落的飞机数 int nplanes;/处理的飞机数 int nrefuse;/拒绝服务的飞机数 int ntakeoff;/起飞的飞机数 void Randomize();/设置随机数种子 int PoissionRandom(double&expectvalue);/根据泊松分布和给定期望值生成随机非负整数 plane*NewPlane(plan
21、e&p,action kind);/建立新飞机的数据项 void Refuse(plane&p,action kind);/拒绝服务 void Land(plane&p);/降落飞机 void Fly(plane&p);/起飞飞机 void Idle();/处理空闲时间单元 void Conclude();/总结模拟结果;24JYP 构造函数初始化各变量,如下所示:构造函数初始化各变量,如下所示:AirportSimulation:AirportSimulation()/构造函数 Boolean ok;cout endtime;idletime=landwait=nland=nplanes=0
22、nrefuse=ntakeoff=takoffwait=0;/初值 Randomize();/设置随机数种子 do cout expectarrive;cout expectdepart;25JYP if(expectarrive 0.0|expectdepart 0.0)cout “这些数不能为负!请重新输入。”1.0)cout “机场将饱和!请重新输入。”endl;ok=FALSE;else ok=TRUE;while(ok=FALSE);26JYP RunSimulation()是模拟运行的主控程序:是模拟运行的主控程序:void AirportSimulation:RunSimula
23、tion()int pri;/伪随机整数 plane p;for(curtime=1;curtime=endtime;curtime+)cout “时间单元”curtime “:”;pri=PoissionRandom(expectarrive);for(int i=1;i=pri;i+)/处理新到达准备降落的飞机 p=*NewPlane(p,ARRIVE);if(landing.IsFull()Refuse(p,ARRIVE);else landing.Add(p);pri=PoissionRandom(expectdepart);27JYP for(int i=1;i limit)n+;x
24、rand()/(double)INT_MAX;return n;30JYP 建立新飞机的数据项由函数建立新飞机的数据项由函数NewPlane实现:实现:plane*AirportSimulation:NewPlane(plane&p,action kind)nplanes+;/飞机总数加1 p.id=nplanes;p.tm=curtime;switch(kind)case ARRIVE:cout “飞机”nplanes “准备降落。”endl;break;case DEPART:cout “飞机”nplanes “准备起飞。”endl;break;return&p;31JYP 处理被拒绝
25、的飞机由函数处理被拒绝的飞机由函数Refuse实现实现:void AirportSimulation:Refuse(plane&p,action kind)switch(kind)case ARRIVE:cout “引导飞机”p.id “到其它机场降落。”endl;break;case DEPART:cout “告诉飞机”p.id “等一会儿再试。”endl;break;nrefuse+;/被拒绝飞机总数加132JYP 处理飞机降落由函数处理飞机降落由函数Land实现:实现:void AirportSimulation:Land(plane&p)int wait;wait=curtime p.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高级 数据结构 PPT 课件
