2月21 深度优先与广度优先
深度优先
事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.
举例说明之:下图是一个无向图,如果我们从A点发起深度优先搜索(以下的访问次序并不是唯一的,第二个点既可以是B也可以是C,D),则我们可能得到如下的一个访问过程:A->B->E(没有路了!回溯到A)->C->F->H->G->D(没有路,最终回溯到A,A也没有未访问的相邻节点,本次搜索结束).简要说明深度优先搜索的特点:每次深度优先搜索的结果必然是图的一个连通分量.深度优先搜索可以从多点发起.如果将每个节点在深度优先搜索过程中的"结束时间"排序(具体做法是创建一个list,然后在每个节点的相邻节点都已被访问的情况下,将该节点加入list结尾,然后逆转整个链表),则我们可以得到所谓的"拓扑排序",即topological sort. [1]
定义一个结构体来表达一个NODE的结构: [2] struct Node { int self; //数据 node *left; //左节点 node *right; //右节点 };A是第一个访问的,然后顺序是B和D、然后是E。
然后再是C、F、G。
那么我们怎么来保证这个顺序呢?这里就应该用堆叠的结构,因为堆叠是一个先进后出的顺序。
通过使用C++的STL,下面的程序能帮助理解:const int TREE_SIZE = 9; std::stack<node*> visited, unvisited; node nodes[TREE_SIZE]; node* current; for( int i=0; i<TREE_SIZE; i++) //初始化树 { nodes[i].self = i; int child = i*2+1; if( child<TREE_SIZE ) //Left child nodes[i].left = &nodes[child]; else nodes[i].left = NULL; child++; if( child<TREE_SIZE ) //Right child nodes[i].right = &nodes[child]; else nodes[i].right = NULL;} unvisited.push(&nodes[0]); //先把0放入UNVISITED stack while(!unvisited.empty()) //只有UNVISITED不空 { current=(unvisited.top()); //当前应该访问的 unvisited.pop(); if(current->right!=NULL) unvisited.push(current->right); // 把右边压入 因为右边的访问次序是在左边之后 if(current->left!=NULL) unvisited.push(current->left); visited.push(current); cout<<current->self<<endl; }
广度优先
2月21 深度优先与广度优先相关推荐
- Elasticsearch聚合性能优化:深度优先和广度优先
原文链接:https://www.elastic.co/guide/cn/elasticsearch/guide/current/_preventing_combinatorial_explosion ...
- 深度优先搜索广度优先搜索
1 概述 算法是作用于具体的数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于图这种数据结构的.主要原因是因为图的这种数据结构表达能力很强,大部分涉及搜索的场景都可以抽象成图. 图上的搜索算法 ...
- 第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—深度优先与广度优先原理...
第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲-深度优先与广度优先原理 网站树形结构 深度优先 是从左到右深度进行爬取的,以深度为准则从左到右的执行(递归方式实现)Scrapy默认 ...
- 10月21日!API 大赛决赛暨移动云开发者论坛邀您见证数字创新的力量
2021年7月,移动云API应用创新开发大赛正式启动,历时近两个月的时间,共计报名889人,最终提交作品166项.经过前期初审.初赛.复赛等环节,最终企业.移动和高校赛道共29个目团队成功问鼎移动云A ...
- “决胜算力时代 ”AI算力高端闭门分享会(7月21日)
2018年07月21日,"决胜算力时代 "AI算力高端闭门分享会将在北京天使汇极客咖啡举办.本次沙龙是由 CSDN 发起,由CTO俱乐部,深脑链.AI科技大本营和区块链大本营协办. ...
- python爬虫算法深度优先_爬虫课程(四)|深度优先和广度优先算法
深度优先和广度优先算法在爬取一个整站上经常用到,本课程主要讲解这两个算法的原理以及使用过程. 一.网站的树结构 1.1.一个网站的url结构图 以知乎为例,知乎目前有发现.话题.Live.书店.圆桌. ...
- 智源论坛 | 智能处理器探索(3月21日)
活动亮点 系列论坛,AI技术前沿精粹尽览 独家经验分享,顶尖学者零距离 探讨前沿技术,亦分享职业经验 助你成为更好的研究者.工程师 时间:2019年3月21日 14:00-18:00 地点:北 ...
- 中国AI创新者论坛将于3月21日在清华大学举办
来源:网易智能 创新者是如何改变世界的? 史蒂夫·乔布斯生前在苹果产品发布会上,经常会用同一张幻灯片作为总结,在他身后的大屏幕上会出现一个路标,上面标示着"技术"(Technolo ...
- 2010年5月21日 下雨了
2010年5月21日,下雨了. 天气很凉快. 早上睡到9点,起来出去吃了些早点,然后回来洗个澡,在洗洗衣服,就做在电脑前浪费青春了. 前天把系统换成了win 7 64bit的. 因为之前买了根内存,但 ...
- pb mdi窗口多sheet_Filecoin奖励测试网8月3日开启,主网启动窗口:8月31日至9月21日...
当我们进入 Filecoin 主网启动的最后阶段时,Lotus (Filecoin参考实现)正在取得快速进展.仅在过去两周内,该团队就对 Filecoin 市场实施的数据传输进行了重大改进,完成了验证 ...
最新文章
- 清华 CVer 对自监督学习的一些思考
- openshift scc解析
- 如何制作python检查小软件_如何用Python制作整蛊小程序
- python中的np where_python – np.where在我的熊猫中不起作用
- python 运算符重载_Python3面向对象-运算符重载
- Qt笔记-windows下拷贝文件夹中所有文件
- C语言 指针+二维数组详解 (应付期末、考研的最强笔记,建议收藏)
- C#面向对象编程的3个支柱
- linux 输入java 出现中文乱码
- Catalent康泰伦特上海外高桥临床供应中心扩建温控产能;富士胶片发布2021财年第三季度财报 | 医药健闻...
- 高尔顿钉板与二项分布
- 1.	Zigbee应用程序框架开发指南 - 概述
- JSONObject将json字符串转成java嵌套对象
- Vue图表(v-charts, e-charts)入门安装使用
- 代码本色 processing编程练习
- C语言深度剖析——关键字sizeof、整型数据存储深入、数据类型取值范围深入
- IT项目管理总结:第七章 项目成本管理
- 半同步/半反应堆线程池实现
- 树莓派读写单总线设备DS2431
- 用C语言 判断成绩是否合格
热门文章
- cookie不同页面访问不到的问题
- 题目:求1 + 2!+ 3!+ ... + 20!的和
- openEuler 高校开发者大赛报名启动!广阔天地,码出不凡
- Apache Flink 零基础入门(七):Table API 编程
- 技术要扎扎实实的做,业余功夫也要修炼
- OpenGL ES总结(三)OpenGL通过计算纹理坐标来显示一张图片
- 接口自动化测试框架搭建(4、公用方法之url的拼接)--python+HTMLTestRunnerCN+request+unittest+mock+db
- c语言字符串strl复制转换,C语言字符串基础学习
- 单位阶跃函数的傅里叶变换_傅里叶变换学习笔记(9)
- oracle append 分区,insert append 到底扩展几个数据块?