ImageVerifierCode 换一换
格式:DOCX , 页数:146 ,大小:447KB ,
资源ID:30089910      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/30089910.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验5基本检索与周游方法算法设计.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实验5基本检索与周游方法算法设计.docx

1、实验5基本检索与周游方法算法设计算法分析与设计实验报告实验 5 基本检索与周游方法算法设计姓名 xxx 学号 xxxxx 班级 xxxxxxx时间: xxxxxx 地点: xxxx同组人:无指导教师: xxxxx实验目的1. 掌握基本检索与周游方法算法设计的一般思想。2. 掌握二元树、图的周游和检索算法。3. 理解树、与或树、对策树周游与检索的思想和方法。实验内容1. 二元树周游2. 图的周游3. 准备模拟二元树和模拟图的数据。4. 用递归方法设计二元树周游和检索程序,调试通过。周游和检索的次序可以是先序、中序和后序。5. 用非递归方法设计二元树周游和检索程序,调试通过。周游和检索的次序可以是

2、先序、中序和后序。6. 用递归方法设计图的周游程序,调试通过。周游的次序可以是深度优先,也可以是宽度优先。7. 用非递归方法设计图的周游程序, 调试通过。周游的次序可以是深度优先,也可以是宽度优先。1实验环境硬件: Intel(R) Pentium(R) CPU RAM:4G软件: Myeclipse2013编程语言: Java实验前准备1、算法设计:二元树周游a)、 中根次序周游( LDR )Procedure INORDER(T)/T 是一棵二元树。 T 的每个结点有三个信息段:LCHILD 、 DATA 、 RCHILD/If T 0 then call INORDER(LCHILD(T

3、)call VISIT(T)call INORDER(RCHILD(T)endifendINORDERb)、 先根次序周游( DLR )Procedure PREORDER(T)/T 是一棵二元树。 T 的每个结点有三个信息段:LCHILD 、 DATA 、 RCHILD/If T 0 then call VISIT(T)call PREORDER(LCHILD(T)call PREORDER(RCHILD(T)endifendPREORDERc)、 后根次序周游( LRD )Procedure POSTORDER(T)/T 是一棵二元树。 T 的每个结点有三个信息段:LCHILD 、 DAT

4、A 、 RCHILD/If T 0 then call POSTORDER(LCHILD(T)call POSTORDER(RCHILD(T)call VISIT(T)endifendINORDERd)、 中根次序周游的非递归算法Procedure INORDER1(T)/T 是一棵二元树,每个结点有三个信息段: LCHILD 、 DATA 、RCHILD/使用大小为 m 的栈的一个非递归算法 /1 integer i, m, STACK(M)22if T=0thenreturnendif/T 为空 /3P T; i 0 /周游 T; i为栈顶 /4Loop5WhileLCHILD(P) 0d

5、o/周游左子树 /6i i+17Ifim then print( stack overflow)8Stop9Endif10 STACK(i) P; P LCHILD(P)11 Repeat12 Loop13Call VISIT(P)/P的左子树周游完 /14P RCHILD(P)15IfP 0then exit endif/ 周游右子树 /16If i=0 then return endif17P STACK(i); i i-118Repeat /访问父结点 /19 repeat endINORDER1二、 图的检索与周游a) 图的宽度优先检索算法Line procedure BFS(v)/宽

6、度优先检索 G,它在结点 v 开始执行。 所有已访问结点都标上 VISITED(i)=1 。图 G 和数组 VISITED 是全程量。 VISITED 开始时都已置成 0。 /1VISITED(V) 1; u v2将 Q 初始化库空/Q 是未检测结点的队列 /3Loop4For邻接于 u 的所有结点 wdo5IfVISITED(w)=0thencall ADDQ(w, Q)/w 未 检测 /6VISITED(w) 17Endif8Repeat9If Q 为空 then returnendif/ 不再有还未检测的结点/10Call DELETEQ(u, Q)/ 从队中取一个未检测的结点 /11

7、Repeat12 endBFSb) 图的宽度优先周游Procedure BFT(G , n) Declare VISITED(n)3For i 1 to n do / 将所有结点标注为未访问 /VISITED 0RepeatFor i 1 to n do / 反复调用 BFS/If VISITED(i)=0 then call BFS(i) endifRepeatendBFTc) 图的深度优先检索算法 procedure DFS(v)/ 已知一个 n 结点无向(或有向)图 G= ( V ,E)以及初值已置为零的数组 VISITED(1: n) 。这个算法访问由 v 可以到达的所有结点。G 和

8、VISITED 是全程量。 /VISITED(V) 1;For 邻接于 v 的每个结点 w doIf VISITED(w)=0 then call DFS(w) EndifRepeatendDFSd) 图的深度优先周游算法Procedure DFT(G , n)Declare VISITED(n)For i 1 to n do / 将所有结点标注为未访问 /VISITED 0RepeatFor i 1 to n do / 反复调用 DFS/If VISITED(i)=0 then call DFS(i) endifRepeatendDFT1、 程序设计: 见附 1实验步骤1、准备实验数据。准备

9、模拟二元树和模拟图的数据。将二元树和模拟图的数据保存在文件中,在程序运行时读取,分别取名为btree.txt 和 |Cost.txt其中树的表现形式为第一行为根节点, 其余若干行表示每行第一个数为子节点,第二个数为父节点如:4图的表示方式为第一行为节点数, 边数和是否为有向图, 剩下的行是图和节点所组成的邻接矩阵,文件表示如下图:其中表示为无穷即不可达52、递归方法设计二元树周游和检索 BinaryTree.java根据算法设计的多段图向前处理法的 sparks 语言,写出相应的 java 程序,并调试验证通过。周游和检索的次序可以是先序、 中序和后序。(其中的 为 java中的泛型类,类似

10、c 语言中的宏定义) visit()方法是访问该节点,将其加入到一个链表中,方便以后输出,同时可以减少计算时间时噪声影响。/* 访问结点* param node*/public void visit ( BinaryTreeNode node )list . add ( node . getData ();/* 递归实现二叉树的前序遍历* param BT*/public void preOrderRecursive ( BinaryTreeNode BT )if ( BT!= null )visit ( BT);preOrderRecursive ( BT. getLChild ();pre

11、OrderRecursive ( BT. getRChild ();/* 递归实现二叉树的中序遍历* param BT*/public void inOrderRecursive ( BinaryTreeNode BT )if ( BT!= null )inOrderRecursive ( BT. getLChild ();visit ( BT);inOrderRecursive ( BT. getRChild ();/* 递归实现二叉树的后序遍历6* param BT*/public void postOrderRecursive ( BinaryTreeNode BT )if ( BT!=

12、 null )postOrderRecursive ( BT . getLChild ();visit ( BT);postOrderRecursive ( BT . getRChild ();分别将其结果保存到文件中,分析其结果3、非递归方法设计二元树周游和检索 BinaryTree.java根据最短路径问题的动态规划程序算法的 sparks 语言写出对应的 java 程序,并调试验证通过,对比递归和非递归程序,验证其正确性;/*7* 非递归实现二叉树的中序遍历* param BT*/public void inNotOrderRecursive ( BinaryTreeNode BT )/

13、*MyArrayStackBinaryTreeNode stack;int maxStackSize=50;stack=new MyArrayStackBinaryTreeNode(maxStackSize);*/MyLinkedStack BinaryTreeNode stack =newMyLinkedStack BinaryTreeNode ();BinaryTreeNode p = BT;while ( p!= null |! stack . isEmpty ()while ( p!= null ) / 找到左子树stack . push ( p );p =p . getLChild

14、();if (! stack . isEmpty ()p =stack . pop (); / 先从栈中弹出要结点visit ( p ); / 再访问根结点p =p . getRChild (); / 然后再指向右子树输出结果保存到文件中,可以看出与递归结果一致;4、图的宽度优先检索和周游 GraphSearch .java用邻接矩阵的方式表示整个图并将每个节点是否访问用一个数组表示, 同时访问时将该结点加入到一个链表中去,方便以后输出使用并减少噪声影响;/* 图的宽度优先检索* G ,它在结点 v 开始执行,所有已访问结点都标上 visitedi=1, 图 G 和数组visited 是全程变

15、量 ,visited 开始记为 0* param v*/8public void BFS ( int v )visit ( v );visited v = 1 ;int u = v ;LinkedList Q= new LinkedList (); / 当作放置未检测结点的队列while ( true )LinkedList list =G. costList u;for ( Edge e : list ) / 邻接于 u 的所有结点int w = e . v ;if ( visited w= 0 )Q . add ( w); / 将未检测的结点为 w 放入队列visit ( w); / 访问

16、该结点visited w= 1 ; / 将该结点标记为 1if (! Q. isEmpty () / 若队列不为空u =Q. remove (); / 将未访问的结点从队列取出赋给 u ,并准备下一轮循环 else / 队列为空表示所有结点访问结束return ;/* 宽度优先周游算法*/public void BFT ()for ( int i =1 ; i = G. n; i +) / 将所有结点标注为未访问 /visited i = 0 ;for ( int i =1 ; i G. n ; i +) / 反复调动 BFSif ( visited i = 0)BFS ( i );宽度优先检

17、索结果(最后一行为检索的结果顺序)9宽度优先周游的结果:5、图的深度度优先检索和周游 GraphSearch .java用邻接矩阵的方式表示整个图并将每个节点是否访问用一个数组表示, 同时访问时将该结点加入到一个链表中去,方便以后输出使用并减少噪声影响;/* 图的深度优先检索* 已知一个 n 结点的无向(或有向图) G,以及初会已置为零的数组 visited ,这个算法可到达访问由 v 所可以到过的所有结点, G 和 visite 是全程变量* param v*/public void DFS ( int v )visit ( v ); / 访问该结点visited v = 1 ; / 将该结

18、点标记为 1LinkedList list = G. costList v ;for ( Edge e : list ) / 邻接于 u 的所有结点int w = e. v ;if ( visited w= 0)DFS ( w);10/* 图的深度优先周游*/public void DFT ()for ( int i =1 ; i = G. n; i +) / 将所有结点标注为未访问 /visited i = 0 ;for ( int i =1 ; i G. n ; i +) / 反复调动 DFSif ( visited i = 0)DFS ( i );深度优先检索结果(最后一行为检索的结果顺

19、序)深度优先周游的结果:115、【附】查找族谱中的近亲 FamilyTree.java采用二元树相同的方法将村的结果存储在文件中, 并以二叉树的方式表示树的结构,但解释与二叉树不中,其中左孩子表示子辈,右孩子表示同辈;查找是否是近亲时首先查找该节点, 将该人的 父辈祖先保存在栈 中,采用一般树的后序遍历方法(即二叉树的中序周游方法) 可以达到此效果, 然后再比较它们在规定的代数如 5 代内是否有相同的祖先,如果有则表示他们为近亲;public boolean isNearRelation ( myType x , myType y , int n )MyLinkedStack BinaryTr

20、eeNode stack0 =xStack ( x );MyLinkedStack BinaryTreeNode stack1 =xStack ( y );if ( stack0 = null ) / 若有一个结点未找到System . out . println ( 未找到结点 + x . data );return false ; else if ( stack1 = null )System . out . println ( 未找到结点 + y . data );return false ;int i = 0;LinkedList arryx = new LinkedList ();L

21、inkedList arryy = new LinkedList ();/ 将两个结点的父辈们组成的栈加入链表中,只取前 n 个while (! stack0 . isEmpty ()& i n )BinaryTreeNode s =stack0 . pop ();myType m = s . getData ();arryx . add ( m);i +;i = 0 ;while (! stack1 . isEmpty ()& i n )BinaryTreeNode s =stack1 . pop ();myType m = s . getData ();arryy . add ( m);i

22、 +;/ 比较链表是否有相同元素for ( int j =0 ; j arryx . size (); j +)for ( int k =0 ; k arryy . size (); k +)if ( arryx . get ( j ). equals ( arryy . get ( k )12return true ;return false ;/* 采用后序遍历的方法对就二叉树的中序遍历方法,查找 x 元素,并将该结点的父辈们加入到一个栈中* param x* return*/SuppressWarnings ( unused )public MyLinkedStack BinaryTre

23、eNode xStack ( myType x )BinaryTreeNode p = familyTree . getRoot ();MyLinkedStack BinaryTreeNode stack = newMyLinkedStack BinaryTreeNode ();while ( p!= null |! stack . isEmpty ()while ( p!= null ) / 先找到子树的最左边结点stack . push ( p );p =p . getLChild ();if (! stack . isEmpty ()if (! stack . isEmpty ()p =

24、 stack . pop (); / 先从栈中弹出要结点if ( p . getData (). equals ( x ) / 找到的话直接结束查找, 最终返回的是其父辈的终成的栈return stack ;p = p. getRChild (); / 然后再指向右子树 / 未找到返回空return null ;族谱结构为(从 1 开始顺序编号)13表示的图形为14用二叉树表示如下:比如查找 F2 和 E8 是否是 5 代以内的近亲,由图中可以清楚看到是,结果与之一致15查找它们是否为 4 代以内的近亲时,可以看出它是不是的实验结果及其分析1、递归方法设计二元树周游和检索如果访问一个结点所需要

25、的时间和空间为 O(1) ,n 个结点每个结点均门访问一次,这么算法的时间和空间复杂度均为 O(n) ;2、图的宽度优先检索和周游图的宽度优先检索, t(n,e)=O(n+e)图的宽度优先检索BFSn102030405060708090100100000 次运行耗时1232524476579671335177422762852345216图的宽度度优先周游, t(n)=O(n 2 )图的宽度优先周游BFTn102030405060708090100100000 次运行耗时126249440665976134917702290281134773、图的深度优先检索和周游图的深度度优先检索, t(n

26、,e)=O(n+e)图的深度优先检索DFS17n102030405060708090100100000 次运行耗时13918035463496813351749230429813742图的深度度优先周游, t(n)=O(n 2 )图的深度优先周游DFTn102030405060708090100100000 次运行耗时174198363654967134217822328299335964、总结基本的检索和周游算法主要包括对树和图各结点的遍历访问。二元树的访问根据每个子树的访问次序可分为前序周游, 中序周游和后序周游, 三种方法周游18所需要的时间和空间复杂度相同, 但过程中在栈中所存储和结点不同, 在实际情况中可根据需要采取不同的周游方法(比如在查找近亲一

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1