算法分析与设计基本检索与周游方法ppt课件.ppt
《算法分析与设计基本检索与周游方法ppt课件.ppt》由会员分享,可在线阅读,更多相关《算法分析与设计基本检索与周游方法ppt课件.ppt(64页珍藏版)》请在三一办公上搜索。
1、第五章 基本检索与周游方法,一般方法,许多问题的解法涉及到对二元树、树和图的处理。这种处理往拄要求我们确定满足某一性质的那些给定数据对象中的一个结点或结点子集。这通常在数据对象中以检索的方式来进行。当这种检索必须包括对检索的数据对象的每一个结点进行检查时就把它称之为周游。,代码优化,编译程序的作用是,把高级语言程序翻译成一个等效的机器语言程序。假定有一个模型机A,其只有一个累加器寄存器。讨论只限于四个双目运算符:+、-、*、/相应的汇编语言指令:LOAD X 将内存单元X的内容装入累加器。STORE X 将累加器的内容不得存入内存X单无。OP X OP可以是ADD,SUB,MPY或DIV。,例
2、1,相关定义,定义5.1 表达式E翻译成某给定机器的机器语言或汇编语言是最优的,当且仅当这一翻译有最少的指令条数。定义5.2 运算符的交换律。定义5.3 运算符的分配律。定义5.4 运算符的结合律。,例2,例3,MPY c,例4,怎样获取最优代码段?,首先将讨论局限于模型机A。然后,再考察更一般的机器模型。用二叉树表示算术表达式,非叶子结点表示一个运算符,称为内部结点。叶子结点或者表示一个变量或者表示一个常数。这样的二叉树称为表达式树。假定所有的运算符既不可交换,也不可分配或结合。易于证明在任何没有冗余指令的代码段中,除了第一条以外的每条装入指令都必须紧接在一条存放指令之后。因此,装入指令数总
3、比存放指令数多1。所以只要产生使装入指令数或存放指令数为最小值的代码段就是最优的代码。,表达式树,计算LR,注:条件的代码段比条件的要少些,所以应被采用。,生成代码段的算法CODE1,procedure CODE1(T)if T是叶子 then print(“LOAD”,DATA(T)returnendifF=0/如果RCHILD(T)不是叶子,则将F置成1if RCHILD(T)不是叶子 then call CODE1(RCHILD(T)/生成CR call TEMP(i);print(“STORE”,i);F=1endifcall CODE1(LCHILD(T)/生成CLif F=1 th
4、en print(DATA(T),i)call RETEMP(i)else print(DATA(T),DATA(RCHILD(T)endifend CODE1,例5,更一般的情况,现将机器A推广到另一种机器B。B有N1个可以执行算术运算的寄存器。对于B,有四种类型的机器指令:(1)LOAD M,R(2)STORE R,M(3)OP R1,M,R2(4)OP R1,R2,R3,例 6,(1)当N=1时,必须生成一条存放指令,而当N=2时,则 不需要生成存放指令。(2)LOAD的条数不再需要正好比STORE的条数多1。因此,为了最优化而只考虑LOAD数或STORE数就不够了。而要使它们的和取最小
5、值。,如何在机器B上生成最优代码段,给定一个表达式E1、不用任何STORE指令可以算出E的值吗?2、不用任何STORE指令而计算E的值所需要寄存器的最小数量是多少?第一个问题答案是肯定的。下面讨论第二个问题。,函数MR(P)的定义,例 7,机器B的代码生成器,line procedure CODE2(T,i)if T是叶子 then print(LOAD,DATA(T),R,i)returnendifL=LCHILD(T);R=RCHILD(T)case:MR(R)=0:/R是叶子/call CODE2(L,i)print(DATA(T),R,i,DATA(R),R,i):MR(L)=N an
6、d MR(R)=N:call CODE2(R,i)call TEMP(S)print(STORE,R,i,S)call CODE2(L,i)print(DATA(T),R,i,S,R,i)call RETEMP(S),:MR(L)MR(R):/MR(L)N,先计算R call CODE2(R,i)call CODE2(L,i+1)print(DATA(T),R,i+1,R,i,R,i):else:call CODE2(L,i)call CODE2(R,i+1)print(DATA(T),R,i,R,i+1,R,i)endcaseend CODE2,例 8,LOAD d,R1LOAD e,R2A
7、DD R2,f,R2MPY R1,R2,R1STORE R1,T1LOAD a,R1LOAD b,R2ADD R2,c,R2DIV R1,R2,R1ADD R1,T1,R1 N=2,LOAD a,R1LOAD b,R2ADD R2,c,R2DIV R1,R2,R1LOAD d,R2LOAD e,R3ADD R3,f,R3MPY R2,R3,R2ADD R1,R2,R1N=3,定理5.8,对每一棵表达式树T,CODE2都生成正确的代码段。,定义5.5,已知寄存器数目为N,如果一个结点的两个儿子的MR值都至少为N,则称该结点为大结点(major)。如果一个结点是没有父亲的叶子,或者是它父亲的左儿子
8、叶子,则称该结点为小结点(minor)。,引理5.1,设n是表达式树T中的大结点数。当表达式树T没有可交换的运算符且在运算符和运算量之间不存在任何关系(即不允许可结合和可分配的运算符以及公共子表达式)时,为了计算T的值至少需要n条STORE型指令。,引理5.2,对于任何一棵表达式树T,由CODE2所生成的代码段中的STORE型指令条数等于表达式树T中的大结点数。,引理5.3,设m是T中的小结点数,在引理5.1的假设下,计算T的代码段必须至少有m条LOAD指令。,引理5.4,对于任一表达式树T,由CODE2所生成的代码段中的LOAD指令条数等于T中的小结点数。,定理5.9,在引理5.1的条件下,
9、算法CODE2生成最优代码段。,5.3 双连通分图与深度优先检索,本节重点双连通图的概念关节点的概念深度优先检索本节难点关节点识别算法双连通图的构造算法,连通图与双连通图,通信网:图中结点表示通信站,边表示通信线路。下面两个图显然都是无向连通图,但却有不同的特性。出现差异的原因在于这两个图的连通程度不同。,几个基本概念,关节点:如果把无向连通图G中某结点a以及与a相关联的所有边删去,得到二个或二个以上的非空分图,那么结点a就称为G的关节点。双连通图:如果无向连通图G根本不包含关节点,则称G为双连通图。双连通分图:最大双连通子图,双连通分图,图5.14 连通分图,下面我们的任务,设计一个算法,测
10、试某个连通图G是否双连通;若G不是双连通的,找出所有的关节点;确定一个适当的边集加到G上,将其变为一个双连通图。,双连通分图性质,连通图中,两个双连通分图至多有一个公共结点,且这个结点是关节点。任何一条边不可能同时在两个不同的双连通分图中(因为这需要两个公共结点)。由此,可得到把图G变成双连通图的算法。,把连通图G变成一个双连通图,1 for 每一个关节点 a do2 设B1,B2,Bk是包含结点a的双连通 分图;3 设vi是Bi的一个结点,且vi a,1i k4 将(vi,vi+1)加到G;5 repeat,把连通图G变成一个双连通图,10,9,4,1,3,2,5,8,7,6,关节点和双连通
11、分图的识别,怎么识别出关节点?怎么在识别出关节点后,识别出所有的双连通分图?几个概念:深度优先数(DFN)树边逆边交叉边,关节点和双连通分图的识别,几个概念,深度优先数(DFN):DFN(1)=1,DFN(2)=6树边:实线边,代表生成树的边逆边:虚线边,代表不在生成树中的边,关节点的识别,深度优先生成树的两条重要的性质:若(u,v)是G中任一条边,则相对于深度优先生成树T,或者u是v的祖先,或者v是u的祖先。即没有交叉边。(u,v)是一条相对于生成树T的交叉边指的是u不是v的祖先,v也不是u的祖先。当且仅当一棵深度优先生成树的根结点至少有两个儿子时,此根结点是关节点,如果u是除根外的任一结点
12、,那么当且仅当由u的每一个儿子w出发,若只通过w的子孙组成的一条路径和一条逆边就可到达u的某个祖先时,则u就不是关节点。,关节点的识别,对每个结点u,有L(u)定义如下:L(u)=min DFN(u),min L(w)|w是u的儿子,min DFN(w)|(u,w)是一条逆边 显然,L(u)是u通过一条子孙路径且至多后随一条逆边所可能到达的最低深度优先数。由上述讨论可知,如果u不是根,则当且仅当u有一个使得L(w)DFN(u)的儿子w时,u是一个关节点。,计算DFN和L的算法,计算L(u)的方法:按后根次序访问深度优先生成树的结点。确定G的关节点的工作:1、完成对G的深度优先搜索,产生G的深度
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 分析 设计 基本 检索 周游 方法 ppt 课件
链接地址:https://www.31ppt.com/p-5451732.html