




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数据结构实验报告HUNAN UNIVERSITY数据结构实验报告题 目: 图的遍历问题 学生姓名 梁天 学生学号 201408010318 专业班级 计科1403 指导老师 夏艳 日 期 2016.05.14 背景 网络蜘蛛即Web Spider,是一个很形象的名字。把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。网络蜘蛛是通过网页的链接地址来寻找网页,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这
2、个原理把互联网上所有的网页都抓取下来。这样看来,网络蜘蛛就是一个爬行程序,一个抓取网页的程序。在抓取网页的时候,网络蜘蛛一般有两种策略:广度优先和深度优先(如下面这张简单化的网页连接模型图所示,其中A为起点也就是蜘蛛索引的起点)。深度优先顾名思义就是让网络蜘蛛尽量的在抓取网页时往网页更深层次的挖掘进去讲究的是深度!也泛指: 网络蜘蛛将会从起始页开始,一个链接一个链接跟踪下去,处理完这条线路之后再转入下一个起始页,继续跟踪链接! 则访问的节点顺序为=> A -> B -> E -> H -> I -> C -> D -> F -> K -&g
3、t; L -> G。深度爬行的优点是:网络蜘蛛程序在设计的时候相对比较容易些;缺点是每次爬行一层总要向"蜘蛛老家" 数据库访问一下。问问老总有必要还要爬下一层吗! 爬一层问一次. 如果一个蜘蛛不管3721不断往下爬很可能迷路更有可能爬到国外的网站去,不仅增加了系统数据的复杂度更是增加的服务器的负担。广度优先在这里的定义就是层爬行,即一层一层的爬行, 按照层的分布与布局去索引处理与抓取网页。则访问的节点顺序为=> A -> B -> C -> D -> E -> F -> G -> H -> I-> K -&g
4、t; L。广度爬行的优点是对数据抓取更容易控制些,对服务器的负栽相应也明显减轻了许多。问题描述 若用有向网表示网页的链接网络,其中顶点表示某个网页,有向弧表示网页之间的链接关系。试设计一个网络蜘蛛系统,分别以广度优先和深度优先的策略抓取网页。 基本要求(1) 首先输入顶点的数量,然后是各顶点对应的字母,再输入各条弧(权值都置为1)。(2) 输出从首个顶点开始的广度优先遍历序列和深度先遍历序列。测试用例输入输入顶点数和弧数:8 9 输入8个顶点. 输入顶点0:a 输入顶点1:b 输入顶点2:c 输入顶点3:d 输入顶点4:e 输入顶点5:f 输入顶点6:g 输入顶点7:h 输入9条弧. 输入弧0
5、:a b 1 输入弧1:b d 1 输入弧2:b e 1 输入弧3:d h 1 输入弧4:e h 1 输入弧5:a c 1 输入弧6:c f 1 输入弧7:c g 1 输入弧8:f g 1 输出广度优先遍历: a b d h e c f g (写反了 )深度优先遍历: a b c d e f g h实验提示(1) 设图的顶点大于1个,不超过30个,每个顶点用一个编号表示(如果一个图有n个顶点,则它们的编号分别为0, 1, 2, 3, , n-1)。(2) 此题为求有向图的遍历问题,采用邻接表存储图,实现图的基本操作,并编写DFS和BFS程序。选做内容使用邻接矩阵存储图,编写DFS和BFS程序。
6、 课后题目求图的最大连通子图。一、需求分析1.首先输入顶点的数量,然后是各顶点对应的字母,再输入各条弧(权值都置为1);输出从首个顶点开始的广度优先遍历序列和深度先遍历序列;2.为了达到任意图的遍历(结点名称不一定是数字,可以是任意可见字符),可以自定义一个字符数组类型,保存该结点的名字;3.图使用相邻矩阵来实现;4.测试数据:输入输入顶点数和弧数:8 9 输入8个顶点. 输入顶点0:a 输入顶点1:b 输入顶点2:c 输入顶点3:d 输入顶点4:e 输入顶点5:f 输入顶点6:g 输入顶点7:h 输入9条弧. 输入弧0:a b 1 输入弧1:b d 1 输入弧2:b e 1 输入弧3:d h
7、 1 输入弧4:e h 1 输入弧5:a c 1 输入弧6:c f 1 输入弧7:c g 1 输入弧8:f g 1 输出广度优先遍历: a b c d e f g h (这才是正确的结果)深度优先遍历: a b d h e c f g二、概要设计抽象数据类型class Queue/循环顺序队列,为广度优先遍历设计;图类基本操作:Graph(int numVert) bool prior(struct patient x,struct patient y);/图的构造函数void init (int n)/初始化矩阵int n()return numVertex;/返回顶点数目int e()re
8、turn numEdge;/返回边数int first(int v)/返回结点v的第一个邻接结点int next(int v,int w)/返回v的在w之后的第一个邻接结点void setEdge(int v1, int v2, int wt =1)/设置一条边void delEdge(int v1 ,int v2)/删除一条边bool isEdge(int i,int j)/判断两个顶点是否有边连接int weight (int v1,int v2) return matrixv1v2;/返回V1 V2 相连的边权值int getMark(int v) return markv;/返回V顶点
9、是否已经访问的标志int getSub(char c)/获取顶点名字的下标void setMark(int v,int val) markv = val;/设置标志char getName (int v)return Namev;/获取顶点名字void setName(int v,char name)Namev = name;/设置顶点名字图的遍历函数:void DFS(Graph* G,int v) /深度优先遍历函数体void BFS(Graph* G,int start,Queue<int>* Q) /广度优先遍历函数体算法的基本思想用自定义类型的数组,记录每个结点的信息(包
10、括名称Name、是否被访问Mark),这两个数组作为图的私有成员; 深度优先采取的递归思想。首先,将从起点,沿某条边,顺势遍历下去,直到不能继续遍历下去。这时,回溯,接着从未访问的边遍历下去。如此往复,直到将所有结点遍历完。广度优先搜索需要使用队列。首先,将起点入队,并标为已访问。进入循环,当队列不为空时,将队首元素出队,输出到屏幕上,并将与队首元素相邻的且未访问的结点全部放入队列,(一般按照序号由小到大入队)标为已访问。继续队首元素出队,将与队首元素相连的未访问元素入队,直到队空;三、程序的流程:输入顶点数、边数>完成图的初始化>输入顶点名称、设置边>输入遍历起点>深
11、度优先遍历,输出结果>广度优先遍历,输出结果。四、详细设计:物理数据类型根据用户的输入结点数初始化图void init (int n)/初始化矩阵int i;numVertex = n;numEdge = 0;mark = new intn;Name = new charn;for(i=0; i < numVertex;i+)marki = UNVISITED;/全部标志设为未访问Namei = NULL;/顶点名字全部设为空matrix = (int *)new int*numVertex;for( i=0;i < numVertex;i+)matrixi = new in
12、tnumVertex;for( i=0;i < numVertex;i+)for(int j=0;j < numVertex;j+)matrixij =0;2.根据用户输入的边信息用邻接矩阵存储边权值;3.用深度优先和广度优先遍历图,输出结果;算法的时空分析对于具有n个顶点e条边的无向图,当图采用邻接矩阵存储时,算法的总时间为O()。四、调试分析本算法代码为书本上的代码稍微修改得来,理解起来较容易,但是邻接表的创建我一直都搞不懂,所以用了邻接矩阵来创建图;五、测试结果七、附录程序源代码(c+)/*图的遍历*/#include<iostream>using namespa
13、ce std;#include<assert.h>enumUNVISITED,VISITED;const int MAX=100;/队列最大元素个数template <typename E>class Queue/循环顺序队列private:int maxsize;/队列的最大值int front;/指向队首int rear;/指向队尾E * array;/队列数组指针public:Queue(int size = MAX)/构造函数,同时初始化队列maxsize = size +1;/空出一个位置不存放元素,方便判断空队列和满队列rear =0; front =1;a
14、rray = new Emaxsize;/开辟一个大小为maxsize的队列Queue()delete array;void enqueue(const E & it)/元素进队函数assert(rear+2) %maxsize != front, "Queue is full");/判断队是否满array(+rear) %maxsize = it;/在队尾插入新元素E dequeue()/出队函数assert(length() !=0 , "Queue is empty");/判断队是否空E it = arrayfront;/取出队首元素fro
15、nt = (front+1) % maxsize;/队首下标后移一个位置return it;virtual int length() const/队列长度return (rear + maxsize) - front +1) % maxsize;class Graph/图类private:int numVertex, numEdge;/顶点数量和边数;int * matrix;/二维数组指针;int *mark;/标志数组指针char *Name;/顶点名字;public:Graph(int numVert)init(numVert);/初始化图Graph()delete mark;delet
16、e Name;for (int i=0; i < numVertex ;i+)delete matrixi;delete matrix;void init (int n)/初始化矩阵int i;numVertex = n;numEdge = 0;mark = new intn;Name = new charn;for(i=0; i < numVertex;i+)marki = UNVISITED;/全部标志设为未访问Namei = NULL;/顶点名字全部设为空matrix = (int *)new int*numVertex;for( i=0;i < numVertex;i
17、+)matrixi = new intnumVertex;for( i=0;i < numVertex;i+)for(int j=0;j < numVertex;j+)matrixij =0;int n()return numVertex;/返回顶点数目int e()return numEdge;/返回边数int first(int v)/返回结点v的第一个邻接结点for(int i=0;i < numVertex;i+)if(matrixvi != 0) return i;return numVertex;int next(int v,int w)/返回v的在w之后的第一个
18、邻接结点for(int i=w+1;i < numVertex;i+)if(matrixvi != 0) return i;return numVertex;void setEdge(int v1, int v2, int wt =1)/设置一条边assert(wt >0, "Illegal weight value");if(matrixv1v2 = 0) numEdge+;matrixv1v2 =wt;void delEdge(int v1 ,int v2)/删除一条边if(matrixv1v2 != 0) numEdge-;matrixv1v2 =0;bo
19、ol isEdge(int i,int j)/判断两个顶点是否有边连接return matrixij !=0;int weight (int v1,int v2) return matrixv1v2;/返回权值int getMark(int v) return markv;/返回标志int getSub(char c)/获取顶点名字的下标for (int i =0;i < numVertex; i+)if(Namei = c) return i;void setMark(int v,int val) markv = val;/设置标志char getName (int v)return
20、Namev;/获取顶点名字void setName(int v,char name)Namev = name;/设置顶点名字;void DFS(Graph* G,int v) /深度优先遍历函数体cout << G->getName(v) <<" "G ->setMark(v, VISITED);for(int w = G->first(v); w < G->n(); w = G->next(v,w)if(G->getMark(w) = UNVISITED)DFS(G,w);void BFS(Graph* G
21、,int start,Queue<int>* Q) /广度优先遍历函数体int v,w;Q->enqueue(start);G->setMark(start, VISITED);while(Q->length()!=0)v = Q->dequeue();cout << G->getName(v) <<" "for(w=G->first(v); w<G->n();w=G->next(v,w)if(G->getMark(w)=UNVISITED)G->setMark(w,VISITED);Q->enqueue(w);/*主函数*/int main()int numVertex,numEdge,weight,i=0;/顶点数,边数,权值,循环控制值ichar Name1,Name2;/顶点名字变量Queue<int> *Q = new Queue<int>30;/开辟一个队列用来存放BFS搜索的数据cout << "输入顶点数和弧数:"cin >> numVertex >> numEdge;Graph G(numVertex);/根据输入的顶点数初始化图cout
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 苗木移植方案
- 超前小导管施工工艺流程图
- Brand KPIs for neobanking C24 Bank in Germany-英文培训课件2025.4
- 敦煌吐鲁番文献所见回鹘古代历法
- 培训学校楼梯管理制度
- 介绍家人活动方案
- 物理中考一轮复习教案 第十八讲《液体压强、大气压强》
- 仓储公司年会策划方案
- 仓库安全宣传月活动方案
- 仓鼠活动策划方案
- 《铁路技术管理规程》(普速铁路部分)
- 23秋国家开放大学《液压气动技术》形考任务1-3参考答案
- 初中信息技术科学版七年级上册第二单元我的信息生活二进制及二进制与十进制的转换PPT
- 风险辨识及控制措施记录
- DB37-T 5026-2022《居住建筑节能设计标准》
- 火灾自动报警的应急处置课件
- 中考历史中国古代史知识复习1-精讲版课件
- 铁路线路工务入路培训课件
- 第六节 支气管扩张病人的护理课件
- 网络基础培训(简化版) 完整版PPT
- T∕CGMA 022001-2019 屋顶通风装置防雨性能试验方法
评论
0/150
提交评论