深度优先算法(DFS)
根据访问节点的顺序与方式,可以分为广度优先算法(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)相关推荐
- (造轮子)C 创建队列和图实现广度优先算法(BFS)和深度优先算法(DFS)(数据结构)
链表.队列和图实现BFS和DFS算法(C+造轮子+详细代码注释) 1.队列的链式存储结构 队列的链式表示称为链队列,它实际上是一个同时带有队头指针和队尾指针的单链表.头指针指向队头节点,尾指针指向 ...
- 深度优先搜索 python_黄哥Python:图深度优先算法(dfs)
深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法.沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过,搜索将回溯到发现 ...
- python 短进程优先算法_黄哥Python:图深度优先算法(dfs)
深度优先搜索算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法.沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所在边都己被探寻过,搜索将回溯到发现 ...
- 树的前序、中序、后序遍历及深度优先算法DFS、广度优先算法BFS及python实现
刷Leetcode时遇到一种经典数据结构--树,树是典型递归思想来的,学习树有助于学习递归思想以及栈.队列(后续细说),本文对树的结构.遍历算法以及Python实现做总结,以供复习拓展 树是连通的无环 ...
- 动画演示深度优先算法搜寻逃出迷宫的路径
深度优先算法(DFS 算法)是什么? 寻找起始节点与目标节点之间路径的算法,常用于搜索逃出迷宫的路径.主要思想是,从入口开始,依次搜寻周围可能的节点坐标,但不会重复经过同一个节点,且不能通过障碍节点. ...
- 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法
深度优先(DFS) 深度优先遍历,从初始访问结点出发,我们知道初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接 ...
- BFS广度优先算法, DFS深度优先算法,Python,队列实现,栈实现
来源:https://www.bilibili.com/video/BV1Ks411575U/?spm_id_from=333.788.videocard.0 BFS广度优先算法 graph = {& ...
- 算法简介:不撞南墙不回头----深度优先搜索算法(DFS)
算法简介:不撞南墙不回头----深度优先搜索算法(DFS) 算法简介 算法简介 DFS算法简介 略 DFS算法思想 首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点;当没有未访 ...
- 深度优先搜索(DFS) 总结(算法+剪枝+优化总结)
深度优先搜索(DFS) 总结(算法+剪枝+优化总结) 本文中会引用部分实例.文献资料来自不同的作者之手,由于资料整理比较困难,转载地址不在文中列举.如有侵权请联系我更换或删除!对于提供题解思路的各位大 ...
- 【算法很美】深入递归 (下)深度优先搜索DFS问题
深搜.回溯.剪枝 深度优先搜索DFS 2.1 无死角搜索I 数独游戏 部分和 水洼数目 2.2 回溯和剪枝 n皇后问题 素数环 困难的串 小结 一些使用 2.1 无死角搜索I 数独游戏 你一定听说过& ...
最新文章
- React中判断已完成的个数
- Ubuntu下使用UFW配置防火墙(简化iptables的操作)
- 正则表达式学习笔记007--字符组简记法1
- Insus NET Utility
- 《Java语言程序设计》(基础篇原书第10版)第十二章复习题答案
- 进销存excel_不用再花钱买软件做进销存,这份免费的Excel系统送你,财务收
- IEC61850建模说明
- vs2019键盘钩子_注册全局鼠标钩子后用鼠标点击窗口上最大化、最小化、关闭窗口界面卡死...
- 广告学概论--名词解释
- 删除右键菜单中多余项
- Linux------进程概念、进程控制
- 2017-2018-2 20155225《网络对抗技术》实验四 恶意代码分析
- Google Play 新增付款功能一览表
- app中的长连接与实现方式
- Python语言程序设计第二章编程题
- python工具——pypinyin 汉字转换拼音
- IOS7 适配以及向下兼容问题
- blockIO trace
- 基于opencv的人脸识别和检测
- golang 麻将服务器源码,LollipopGo开源游戏服务器框架--global服务器源码
热门文章
- ios信号从4g变成无服务器,iOS12.1.2信号差无法上网怎么办?4G断流解决方法
- 夫妻相濡以沫恩爱一生的八条黄金法则
- Pygame入门 2022 (1)
- 大专选计算机应用怎么样,2021大专计算机应用技术前景怎么样
- Linux CentOS7 磁盘修复 无法加载目录 failed to mount /home 或 A start job is running for /home
- 系统:插上U盘没反应
- android如何实现筛选功能,Android——仿优酷节目筛选功能实现
- int a; int* a; int** a; int (*a)[]; int (*a)(int)
- iPhone修个运营商图标
- 关键词搜索量查询接口