深度优先

事实上,深度优先搜索属于图算法的一种,英文缩写为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 深度优先与广度优先相关推荐

  1. Elasticsearch聚合性能优化:深度优先和广度优先

    原文链接:https://www.elastic.co/guide/cn/elasticsearch/guide/current/_preventing_combinatorial_explosion ...

  2. 深度优先搜索广度优先搜索

    1 概述 算法是作用于具体的数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于图这种数据结构的.主要原因是因为图的这种数据结构表达能力很强,大部分涉及搜索的场景都可以抽象成图. 图上的搜索算法 ...

  3. 第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—深度优先与广度优先原理...

    第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲-深度优先与广度优先原理 网站树形结构 深度优先 是从左到右深度进行爬取的,以深度为准则从左到右的执行(递归方式实现)Scrapy默认 ...

  4. 10月21日!API 大赛决赛暨移动云开发者论坛邀您见证数字创新的力量

    2021年7月,移动云API应用创新开发大赛正式启动,历时近两个月的时间,共计报名889人,最终提交作品166项.经过前期初审.初赛.复赛等环节,最终企业.移动和高校赛道共29个目团队成功问鼎移动云A ...

  5. “决胜算力时代 ”AI算力高端闭门分享会(7月21日)

    2018年07月21日,"决胜算力时代 "AI算力高端闭门分享会将在北京天使汇极客咖啡举办.本次沙龙是由 CSDN 发起,由CTO俱乐部,深脑链.AI科技大本营和区块链大本营协办. ...

  6. python爬虫算法深度优先_爬虫课程(四)|深度优先和广度优先算法

    深度优先和广度优先算法在爬取一个整站上经常用到,本课程主要讲解这两个算法的原理以及使用过程. 一.网站的树结构 1.1.一个网站的url结构图 以知乎为例,知乎目前有发现.话题.Live.书店.圆桌. ...

  7. 智源论坛 | 智能处理器探索(3月21日)

    活动亮点 系列论坛,AI技术前沿精粹尽览 独家经验分享,顶尖学者零距离 探讨前沿技术,亦分享职业经验 助你成为更好的研究者.工程师   时间:2019年3月21日 14:00-18:00   地点:北 ...

  8. 中国AI创新者论坛将于3月21日在清华大学举办

    来源:网易智能 创新者是如何改变世界的? 史蒂夫·乔布斯生前在苹果产品发布会上,经常会用同一张幻灯片作为总结,在他身后的大屏幕上会出现一个路标,上面标示着"技术"(Technolo ...

  9. 2010年5月21日 下雨了

    2010年5月21日,下雨了. 天气很凉快. 早上睡到9点,起来出去吃了些早点,然后回来洗个澡,在洗洗衣服,就做在电脑前浪费青春了. 前天把系统换成了win 7 64bit的. 因为之前买了根内存,但 ...

  10. pb mdi窗口多sheet_Filecoin奖励测试网8月3日开启,主网启动窗口:8月31日至9月21日...

    当我们进入 Filecoin 主网启动的最后阶段时,Lotus (Filecoin参考实现)正在取得快速进展.仅在过去两周内,该团队就对 Filecoin 市场实施的数据传输进行了重大改进,完成了验证 ...

最新文章

  1. 清华 CVer 对自监督学习的一些思考
  2. openshift scc解析
  3. 如何制作python检查小软件_如何用Python制作整蛊小程序
  4. python中的np where_python – np.where在我的熊猫中不起作用
  5. python 运算符重载_Python3面向对象-运算符重载
  6. Qt笔记-windows下拷贝文件夹中所有文件
  7. C语言 指针+二维数组详解 (应付期末、考研的最强笔记,建议收藏)
  8. C#面向对象编程的3个支柱
  9. linux 输入java 出现中文乱码
  10. Catalent康泰伦特上海外高桥临床供应中心扩建温控产能;富士胶片发布2021财年第三季度财报 | 医药健闻...
  11. 高尔顿钉板与二项分布
  12. 1. Zigbee应用程序框架开发指南 - 概述
  13. JSONObject将json字符串转成java嵌套对象
  14. Vue图表(v-charts, e-charts)入门安装使用
  15. 代码本色 processing编程练习
  16. C语言深度剖析——关键字sizeof、整型数据存储深入、数据类型取值范围深入
  17. IT项目管理总结:第七章 项目成本管理
  18. 半同步/半反应堆线程池实现
  19. 树莓派读写单总线设备DS2431
  20. 用C语言 判断成绩是否合格

热门文章

  1. cookie不同页面访问不到的问题
  2. 题目:求1 + 2!+ 3!+ ... + 20!的和
  3. openEuler 高校开发者大赛报名启动!广阔天地,码出不凡
  4. Apache Flink 零基础入门(七):Table API 编程
  5. 技术要扎扎实实的做,业余功夫也要修炼
  6. OpenGL ES总结(三)OpenGL通过计算纹理坐标来显示一张图片
  7. 接口自动化测试框架搭建(4、公用方法之url的拼接)--python+HTMLTestRunnerCN+request+unittest+mock+db
  8. c语言字符串strl复制转换,C语言字符串基础学习
  9. 单位阶跃函数的傅里叶变换_傅里叶变换学习笔记(9)
  10. oracle append 分区,insert append 到底扩展几个数据块?