根据访问节点的顺序与方式,可以分为广度优先算法(BFS)和深度优先算法(DFS),本文介绍深度优先算法:

深度优先算法

1、算法概述

深度优先搜索属于图算法的一种,英文缩写为DFS。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。

深度优先搜索是一种在开发爬虫早期使用较多的方法,它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) 。

它的思想:
a.访问顶点v;

b.依次从v的未被访问的邻接点出发,对图进行深度优先遍历;直至图中和v有路径相通的顶点都被访问;

c.若此时图中尚有顶点未被访问,则从一个未被访问的顶点出发,重新进行深度优先遍历,直到图中所有顶点均被访问过为止。

2、原理详解

(深度优先搜索用栈(stack)来实现,整个过程可以想象成一个倒立的树形)
1、把根节点压入栈中。

2、每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱。

3、找到所要找的元素时结束程序。

4、如果遍历整个树还没有找到,结束程序。

本文中,我们使用深度优先算法给图做一个遍历,从而介绍它的原理:

先给出一个图:

假设选定节点A为根节点,将根节点A放入栈中。从栈中取出节点A,寻找到A的子节点B、C并放入栈中。(此时处于节点A)

从栈中取出节点B,寻找B的子节点D,放入栈中。(此时处于节点B)

取出节点D,寻找子节点F并放入栈中。

下一步取出节点F重复执行以上操作,直至遍历全图。

需要注意的是:

  • 当一个节点有多个子节点,子节点入栈的顺序是随机的,也就是说同样一个图,可以产生多种结果。
  • 走到节点F时,会发现F没有子节点,那么此时就会回跳到F的父节点,并寻找一个尚未走过的节点(若父节点没有尚未走过的子节点,则继续回跳),回跳的过程可以不用表述。

3、代码描述

# -*- coding: utf-8 -*-
"""
Created on Sun Mar 31 16:56:06 2019@author: King
"""graph = {'A':['B','C'],'B':['A','C','D'],'C':['A','B','D','E'],'D':['B','C','E','F'],'E':['C','D'],'F':['D']}def DFS(graph,start):stack = list(start) #将起始节点放入栈closed = set() #创建一个集合,存放已经走过的节点closed.add(start)while(len(stack)>0):vertex = stack.pop() #从栈取出一个节点nodes = graph[vertex]#判断节点是否走过for node in nodes:  if node not in closed:#若节点没有走过,则放入栈与集合stack.append(node) closed.add(node)print(vertex,end='\t')DFS(graph,'A') '''
若以A为根节点,那么遍历的结果可以是:
A       C       E       D       F       B
'''

深度优先算法(DFS)相关推荐

  1. (造轮子)C 创建队列和图实现广度优先算法(BFS)和深度优先算法(DFS)(数据结构)

    链表.队列和图实现BFS和DFS算法(C+造轮子+详细代码注释) 1.队列的链式存储结构   队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表.头指针指向队头节点,尾指针指向 ...

  2. 深度优先搜索 python_黄哥Python:图深度优先算法(dfs)

    深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法.沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过,搜索将回溯到发现 ...

  3. python 短进程优先算法_黄哥Python:图深度优先算法(dfs)

    深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法.沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过,搜索将回溯到发现 ...

  4. 树的前序、中序、后序遍历及深度优先算法DFS、广度优先算法BFS及python实现

    刷Leetcode时遇到一种经典数据结构--树,树是典型递归思想来的,学习树有助于学习递归思想以及栈.队列(后续细说),本文对树的结构.遍历算法以及Python实现做总结,以供复习拓展 树是连通的无环 ...

  5. 动画演示深度优先算法搜寻逃出迷宫的路径

    深度优先算法(DFS 算法)是什么? 寻找起始节点与目标节点之间路径的算法,常用于搜索逃出迷宫的路径.主要思想是,从入口开始,依次搜寻周围可能的节点坐标,但不会重复经过同一个节点,且不能通过障碍节点. ...

  6. 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法

    深度优先(DFS) 深度优先遍历,从初始访问结点出发,我们知道初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接 ...

  7. BFS广度优先算法, DFS深度优先算法,Python,队列实现,栈实现

    来源:https://www.bilibili.com/video/BV1Ks411575U/?spm_id_from=333.788.videocard.0 BFS广度优先算法 graph = {& ...

  8. 算法简介:不撞南墙不回头----深度优先搜索算法(DFS)

    算法简介:不撞南墙不回头----深度优先搜索算法(DFS) 算法简介 算法简介 DFS算法简介 略 DFS算法思想 首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点;当没有未访 ...

  9. 深度优先搜索(DFS) 总结(算法+剪枝+优化总结)

    深度优先搜索(DFS) 总结(算法+剪枝+优化总结) 本文中会引用部分实例.文献资料来自不同的作者之手,由于资料整理比较困难,转载地址不在文中列举.如有侵权请联系我更换或删除!对于提供题解思路的各位大 ...

  10. 【算法很美】深入递归 (下)深度优先搜索DFS问题

    深搜.回溯.剪枝 深度优先搜索DFS 2.1 无死角搜索I 数独游戏 部分和 水洼数目 2.2 回溯和剪枝 n皇后问题 素数环 困难的串 小结 一些使用 2.1 无死角搜索I 数独游戏 你一定听说过& ...

最新文章

  1. React中判断已完成的个数
  2. Ubuntu下使用UFW配置防火墙(简化iptables的操作)
  3. 正则表达式学习笔记007--字符组简记法1
  4. Insus NET Utility
  5. 《Java语言程序设计》(基础篇原书第10版)第十二章复习题答案
  6. 进销存excel_不用再花钱买软件做进销存,这份免费的Excel系统送你,财务收
  7. IEC61850建模说明
  8. vs2019键盘钩子_注册全局鼠标钩子后用鼠标点击窗口上最大化、最小化、关闭窗口界面卡死...
  9. 广告学概论--名词解释
  10. 删除右键菜单中多余项
  11. Linux------进程概念、进程控制
  12. 2017-2018-2 20155225《网络对抗技术》实验四 恶意代码分析
  13. Google Play 新增付款功能一览表
  14. app中的长连接与实现方式
  15. Python语言程序设计第二章编程题
  16. python工具——pypinyin 汉字转换拼音
  17. IOS7 适配以及向下兼容问题
  18. blockIO trace
  19. 基于opencv的人脸识别和检测
  20. golang 麻将服务器源码,LollipopGo开源游戏服务器框架--global服务器源码

热门文章

  1. ios信号从4g变成无服务器,iOS12.1.2信号差无法上网怎么办?4G断流解决方法
  2. 夫妻相濡以沫恩爱一生的八条黄金法则
  3. Pygame入门 2022 (1)
  4. 大专选计算机应用怎么样,2021大专计算机应用技术前景怎么样
  5. Linux CentOS7 磁盘修复 无法加载目录 failed to mount /home 或 A start job is running for /home
  6. 系统:插上U盘没反应
  7. android如何实现筛选功能,Android——仿优酷节目筛选功能实现
  8. int a; int* a; int** a; int (*a)[]; int (*a)(int)
  9. iPhone修个运营商图标
  10. 关键词搜索量查询接口