图的遍历之广度优先搜索
2015-10-13 20:35
507 查看
广度优先搜索遍历类似于树的按层次遍历的过程。假设从图中某个顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使用”先被访问的顶点的邻接点“先于”后被访问的顶点的邻接点“被访问,直至图中所有已被访问的顶点的邻接点都被访问到。若此时图中尚有顶点未被访问,则选图中一个未被访问的节点作为起始点,重复上述过程,直至图中所有顶点都被访问到为止。若用邻接表存储图,广度优先搜索的时间复杂度为o(n + e)。#include<iostream> #include<vector> #include<fstream> #include<queue> #include<time.h> using namespace std; void readGraph();//读取文件,存储图 void DFSTraverse();//图的深度优先搜索 void DFS(int v);//从某个顶点出发的深度优先搜索 int nodeNum;//图中顶点数 int edgeNum;//图中边数 vector<vector<int>> mGraph;//图的存储结构 bool *visited;//是否访问的当前节点的数组 //从文件中读取数据,存储在图中 void readGraph() { fstream fin("E:\\myData\\citeseerx.txt");//打开文件 fin>>nodeNum>>edgeNum;//读取边数和顶点数 mGraph.resize(nodeNum);//设置图中有多少个顶点 visited = new bool[nodeNum]; for(int i = 0; i < nodeNum; ++i) { visited[i] = false; } int num1, num2, node; for(int i = 0; i < nodeNum; ++i) { fin>>num1>>num2; mGraph[i].reserve(num2); for(int j = 0; j < num2; ++j) { fin>>node; mGraph[i].push_back(node); } } fin.close(); } void BFSTraverse() { queue<int> q;//定义一个队列,存储未被访问的节点 for(int i = 0; i < nodeNum; ++i) { if(!visited[i]) { visited[i] = true; q.push(i); while(!q.empty()) { int k = q.front(); //cout<<k<<endl; int count = mGraph[k].size(); for(int j = 0; j < count; ++j) { if(!visited[mGraph[k][j]]) { q.push(mGraph[k][j]); visited[mGraph[k][j]] = true; } } q.pop(); } } } } int main(void) { clock_t start,end; start = clock(); readGraph(); cout<<"图中节点数:"<<nodeNum<<endl; cout<<"图中边数:"<<edgeNum<<endl; end = clock(); cout<<"读取文件初始化图的时间:"<<float(end - start)/CLOCKS_PER_SEC*1000<<endl; start = clock(); BFSTraverse(); end = clock(); cout<<"深度优先搜索时间:"<<float(end - start)/CLOCKS_PER_SEC*1000<<endl; system("pause"); return 0; }实验结果:单位为(ms)
void BFSTraverse()
{
clock_t start,end;
start = clock();
/*....中间代码......*/
end = clock();
cout<<"深度优先搜索时间:"<<float(end - start)/CLOCKS_PER_SEC*1000<<endl;
}
数据集为web-uk
图中节点数:22753644
图中边数:38184039
读取文件初始化图的时间:110750
深度优先搜索时间:3327(这个是中间代码运行的时间)
数据集为web-uk
图中节点数:22753644
图中边数:38184039
读取文件初始化图的时间:108102
深度优先搜索时间:228686(整个函数运行的时间)
数据集为cit-Patents
图中节点数:3774768
图中边数:16518947
读取文件初始化图的时间:29783
深度优先搜索时间:323(整个函数运行的时间)
数据集为citeseerx
图中节点数:1457057
图中边数:3002252
读取文件初始化图的时间:6694
深度优先搜索时间:63(整个函数运行的时间)
总结:中间代码运行时间比深度优先遍历运行时间要短(深度优先遍历使用了递归调用,耗时)。
中间代码的运行时间比整个BFSTraverse运行时间要长(在函数中使用了queue<int>队列,运行到函数
末尾时,需要释放给它分配的空间)。
相关文章推荐
- TW Assignment的代码实现
- 20151013知识体系整理,需与20151011相整合
- 蓝懿iOS 技术内容和心得 10。13
- JAVA异常分析
- 音乐播放器-MainFragment分析2
- tomcat 性能优化
- MARKDOWN使用小计
- Kafka logo分布式发布订阅消息系统 Kafka
- ibatis学习笔记
- Android基础入门教程——8.2.1 Bitmap(位图)详解
- iOS UICollectionView 详解
- 《统计学习方法》+最小二乘拟合多项式系数推导过程+P12推导勘误
- python if __name__ == '__main__' 详解
- codeforces586A Alena's Schedule(模拟)
- Android 红圈营销项目 —— 自定义柱形图和自定义折线图
- 5.36(Geometry:area of a regular polygon)
- linux0.99网络模块-网络模块初始化
- IBM SPSS modeler 17 无限使用
- Tomcat 性能优化(连接数、线程、JVM、dir)
- Dlib库的安装配置