1. 图

定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合.

简单点的说:图由节点和边组成。一个节点可能与众多节点直接相连,这些节点被称为邻居。

如二叉树就为一个简单的图:

更加详细的信息可参见:https://www.cnblogs.com/polly333/p/4760275.html

2. 算法

1). 广度优先搜索:

广度优先搜索算法(Breadth First Search,BSF),思想是:

  • 1.从图中某顶点v出发,首先访问定点v
  • 2.在访问了v之后依次访问v的各个未曾访问过的邻接点;
  • 3.然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问;
  • 4.直至图中所有已被访问的顶点的邻接点都被访问到;
  • 5.如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。

换句话说,广度优先搜索遍历图的过程是以v为起点,由近至远,依次访问和v有路径相通且路 径长度为1,2...的顶点。

如上图的BFS访问顺序为:

A->B->C->D->E->F

2). 深度优先搜索:

图的深度优先搜索(Depth First Search, DFS),和树的前序遍历非常类似。

它的思想:

  • 1.从顶点v出发,首先访问该顶点;
  • 2.然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图;
  • 3.直至图中所有和v有路径相通的顶点都被访问到。
  • 4.若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止

如上图的BFS访问顺序为:

A->B->D->E->C->F

3. 代码

# -*- coding: utf-8 -*-
#/usr/bin/pythonfrom collections import deque
import sysclass Graph(object):def __init__(self, *args, **kwargs):self.order = []     #visited order self.neighbor = {}def add_node(self, node):key,val = nodeif not isinstance(val, list):print('node value should be a list')        #sys.exit('failed for wrong input')self.neighbor[key] = valdef broadth_first(self, root):if root != None:search_queue = deque()search_queue.append(root)visited = []else:print('root is None')return -1while search_queue:person = search_queue.popleft()self.order.append(person)if (not person in visited) and (person in self.neighbor.keys()):search_queue += self.neighbor[person]visited.append(person)def depth_first(self, root):if root != None:search_queue = deque()search_queue.append(root)visited = []else:print('root is None')return -1while search_queue:person = search_queue.popleft()self.order.append(person)if (not person in visited) and (person in self.neighbor.keys()):tmp = self.neighbor[person]tmp.reverse()for index in tmp:search_queue.appendleft(index)visited.append(person)#self.order.append(person)def clear(self):self.order = []def node_print(self):for index in self.order:print(index, end='  ') if __name__ == '__main__':g = Graph()g.add_node(('1',['one', 'two','three']))g.add_node(('one',['first','second','third']))g.add_node(('two',['1','2','3']))g.broadth_first('1')print('broadth search first:') print('  ', end='  ')g.node_print()g.clear()print('\n\ndepth search first:') print('  ', end='  ')g.depth_first('1')g.node_print()print()

ps: 以上代码需要用python3.x运行,python2.x不支持print的关键字参数

PS2: 以上代码有些许不完善,如果你有改进的方法,请留言,万分感谢!

转载于:https://www.cnblogs.com/Jimmy1988/p/8184192.html

常用算法2 - 广度优先搜索 深度优先搜索 (python实现)相关推荐

  1. networkx 有向图强连通_leetcode刷题(四):搜索(深度优先搜索,广度优先搜索)拓扑排序,强连通分量...

    在开始今天的话题之前,我们先了解一个概念,什么是图的遍历? 图的遍历就是从图中某一点出发访遍图中其余剩余定点,且每个顶点仅被访问一次,这个过程叫做图的遍历. 图的遍历主要被分为深度优先遍历和广度优先遍 ...

  2. 优先深度搜索判断曲线相交_程序员必知的十大基础实用算法之-DFS(深度优先搜索)...

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

  3. 算法(6)深度优先搜索和广度优先搜索

    一.深度优先搜索(DFS) 主要思路: 从图中一个未访问的顶点 V 开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到底,不断递归重复此过程,直到所有的顶点都遍历 ...

  4. leetcode算法入门 第七天 广度优先搜索/深度优先搜索

    leecode练习 733.图像渲染 695.岛屿最大面积 733.图像渲染 这道题题目很绕,其实就是一道深度优先搜索,将像素值相同的所有连通区域修改成新的像素值,只需要记录旧的像素值进行递归遍历即可 ...

  5. 【从零到蓝桥杯省一】算法详解之深度优先搜索

    前言 大家好,我是泡泡,一名算法爱好者,在学习算法的这条路上有很多的坎坷与'大山',想必各位都深有体会,我认为学习算法的几个很卡的点,首当其冲就是深度优先搜索和广度优先搜索,虽然理解了是什么意思但是完 ...

  6. 第九章:广度优先和深度优先搜索的一些总结

    图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS) 阅读本文前,请确保你已经掌握了递归.栈和队列的基本知识,如想掌握搜索的代码实现,请确保你能够用代码实现栈和队列的基本操作. 深度优先遍 ...

  7. 打印数组算法:堆栈与深度优先搜索(迷宫问题)

    每日一贴,今天的内容关键字为打印数组 栈堆的拜访规矩被制约为Push和Pop两种作操,Push(入栈或压栈)向栈顶添加元素,Pop(出栈或弹出)则掏出前当栈顶的元素,也就是说,只能拜访栈顶元素而不能拜 ...

  8. 搜索与回溯算法:DFS(深度优先搜索)

    深度优先搜索:1.确定回溯终止条件2.重复生成其他可能 今天开始改用JavaScript 我的LeetCode题解: 力扣,剑指 Offer 12. 矩阵中的路径 力扣,剑指 Offer 13. 机器 ...

  9. 搜索 —— 深度优先搜索(DFS)

    [概述] 深度优先搜索,是从初始状态起,利用一定的规则生成搜索树,寻找下一层任一个结点,检查是否出现目标状态,若未出现,以此状态利用规则生成再下一层任一个结点,再检查,重复过程一直到叶节点(即不能再生 ...

最新文章

  1. Hello World
  2. 《深入理解Spark:核心思想与源码分析》——第1章环境准备
  3. 网站建设想要赢得用户的认可和客户的满意并不容易
  4. calender获取本月最后一天的日期_怕忘记2020法考重点日期?这份法考日历为你护航,信息量巨大...
  5. Kettle能做什么?
  6. 局域网限速软件_2号破解app重器推荐一款强大的快捷软件
  7. 1063. 计算谱半径(20)
  8. r语言 精美rda图_R语言动态图可视化:如何、创建具有精美动画的图
  9. 做csdn图片水印中最亮的崽
  10. Dataguard之redo传输服务
  11. Sharepoin学习笔记—架构系列--Sharepoint的网页(Page),网页解析(Parsing)与解析安全处理(Security)...
  12. 10.27T1 堆贪心
  13. python文本词频统计是字典吗,只使用字典python3计算.txt文件中的词频
  14. CXF WebService视频教程,自己录的(更新第7集 异步调用 2009.1.15)。
  15. Xamarin自学教程(Android)之一
  16. css loader.net,css-loader style-loader原理探究
  17. PX4新增自定义orb消息
  18. 一份无锡工程师的分享
  19. 【性能提升神器】STRAIGHT_JOIN
  20. 分享几款C/C++在线编译器

热门文章

  1. jQueryEasyUI应用 – datagrid之CRUD应用
  2. Java8-2-Lambda表达式实战-一句话实现Map中按照Value排序
  3. LabVIEW2020下载与安装教程
  4. 数据结构笔记(二十)--二叉树的存储
  5. python数字和运算符空格_Python基础——运算符与数据结构(200315)
  6. 智能判断图片中是否存在某物体_基于WT901传感器及NB-IOT无线技术开发的一款物体倾倒监测设备...
  7. pycharm去除波浪线的方法
  8. 日出时的画面_摄影教学堂:如何拍摄日出日落?详解日出日落的摄影技巧
  9. 检查 ubuntu 版本_如何检查Ubuntu版本–快速简便的方法
  10. python子进程异常结束_Python子进程