图的搜索

深度优先搜索(Depth First Search)

定义
从例子出发理解

  • DFS是一种用于遍历或搜寻树类或图类数据结构的算法,这种算法从根结点出发(如果是图,则任意选择一个顶点作为根结点),在回溯之前会尽可能地遍历每一个分支。
  • DFS类似于树的先序遍历

    假设根结点为A,左结点优先于右结点,并且不会重复遍历,
    则上图的DFS路径:A→B→D→F→E→C→G
    如果不遍历时不标记已遍历过的结点,则会重复遍历,
    DFS路径会是:A→B→D→F→E→A,循环无法结束

从即将实现的代码设计中理解

  • 指定一个索引如0对其进行DFS,
  • 在其存放相连结点的队列queue中按顺序获取子结点,第一个为6,标记6为已搜寻
  • 然后对6的子结点,按顺序搜索,第一个为0,0在最开始就提前标记已搜寻,
  • 转向第二个子结点4,标记4为已搜寻,
  • 接下来对4的子结点搜寻,以此类推直到搜寻到一个结点它的所有子结点都被搜寻过了
  • 就往回后退,后退过程中逐个检查是否存在未搜寻的结点,如果有则搜寻,否则回到最初的0结点,进行下一个子结点搜寻

方法与属性设计

  1. self.G 接收传入的无向图(上一节实现的)
  2. self.marked 标记已经遍历过的顶点,True为标记,False为未标记
  3. self.count 对顶点计数,初始值为0,运行完代码它应该为顶点的数量
  4. is_marked() 返回marked的值
  5. dfs()对图进行深度优先搜索
  6. count_all_connected()返回所有相连的顶点(count)

Python代码实现

from Structure.graph.Undigraph import Undigraphclass DepthFirstSearch:def __init__(self, graph, x):"""The vertex [x] is also a index of the graph G"""self.G = graphself.marked = [False for _ in range(self.G.vertex)]self.count = 0  # Count the vertices connected with the vertex xself.dfs(x)def is_marked(self, x):return self.marked[x] is Truedef dfs(self, x):self.marked[x] = Trueedges = self.G.get_edges_of(x)for n in edges:if not self.marked[n]:self.dfs(n)self.count += 1def count_all_connected(self):return self.countif __name__ == '__main__':UG = Undigraph(13)UG.add_edge(0, 5)UG.add_edge(0, 1)UG.add_edge(0, 2)UG.add_edge(0, 6)UG.add_edge(5, 3)UG.add_edge(5, 4)UG.add_edge(3, 4)UG.add_edge(4, 6)UG.add_edge(7, 8)UG.add_edge(9, 10)UG.add_edge(9, 11)UG.add_edge(9, 12)UG.add_edge(11, 12)vertex1 = 0DFS = DepthFirstSearch(UG, vertex1)print(f"Count all the vertices connected with the vertex[{vertex1}]: {DFS.count_all_connected()}")vertex2 = 5print(f"If vertex[{vertex2}] is connected with vertex[{vertex1}]? {DFS.is_marked(vertex2)}")vertex3 = 7print(f"If vertex[{vertex3}] is connected with vertex[{vertex1}]? {DFS.is_marked(vertex3)}")

运行结果

Count all the vertices connected with the vertex[0]: 7
If vertex[5] is connected with vertex[0]? True
If vertex[7] is connected with vertex[0]? False

调用上一节实现的无向图,运行即完成了DFS
附上搜寻的图:

广度优先搜索(Breadth First Search)

定义
从示例来理解

  • BFS是一种用于遍历或搜寻树类或图类数据结构的算法,这种算法从根结点出发(如果是图,则任意选择一个顶点作为根结点),有时会引用“搜索键”,来对当前所有相邻结点优先于下一层结点的顺序进行遍历或搜索。
  • BFS类似树中的层次遍历

    假设从V1结点出发,则遍历顺序是:V1→V2→V3→V4→V5→V6→V7→V8

从即将实现的代码设计中理解

  • 回想树的层序遍历(layer_ergodic)中,遍历时借助了一个辅助队列
  • 将根结点存入到辅助队列,然后将队列中的元素弹出来
  • 弹出来发现它有子结点,将左右子结点先后放入到辅助队列,然后继续弹出一个结点
  • 为左子结点,判断其是否还有子结点,有则放入队列
  • 同样的对右子结点进行弹出判断。。。以此类推,直到没有元素可弹为止

主要方法与属性设计

与DFS相同的设计属性就不重复介绍了

  1. self.queue BFS的辅助队列
  2. bfs() 对传入类中的图进行广度优先遍历

Python代码实现

from Structure.graph.Undigraph import Undigraphclass BreadthFirstSearch:def __init__(self, graph, x):self.graph = graphself.marked = [False for _ in range(self.graph.vertex)]self.count = 0self.queue = []self.bfs(x)# self.dfs1(x)def is_marked(self, x):return self.marked[x]def bfs(self, x):self.marked[x] = Trueself.queue += self.graph.v_edges[x]while self.queue:next_vertex = self.queue.pop(0)if self.is_marked(next_vertex):continueprint(f"Next vertex is {next_vertex}")self.marked[next_vertex] = Trueif self.graph.v_edges[next_vertex]:self.queue += self.graph.v_edges[next_vertex]self.count += 1self.count += 1def count_all_connected(self):return self.countif __name__ == '__main__':UG = Undigraph(13)UG.add_edge(0, 5)UG.add_edge(0, 1)UG.add_edge(0, 2)UG.add_edge(0, 6)UG.add_edge(5, 3)UG.add_edge(5, 4)UG.add_edge(3, 4)UG.add_edge(4, 6)UG.add_edge(7, 8)UG.add_edge(9, 10)UG.add_edge(9, 11)UG.add_edge(9, 12)UG.add_edge(11, 12)vertex1 = 0BFS = BreadthFirstSearch(UG, vertex1)print(f"Count all the vertices connected with the vertex[{vertex1}]: {BFS.count_all_connected()}")vertex2 = 3print(f"If vertex[{vertex2}] is connected with vertex[{vertex1}]? {BFS.is_marked(vertex2)}")vertex3 = 7print(f"If vertex[{vertex3}] is connected with vertex[{vertex1}]? {BFS.is_marked(vertex3)}")

运行结果

Next vertex is 5
Next vertex is 1
Next vertex is 2
Next vertex is 6
Next vertex is 3
Next vertex is 4
Count all the vertices connected with the vertex[0]: 7
If vertex[3] is connected with vertex[0]? True
If vertex[7] is connected with vertex[0]? False

搜寻结果是 (0),5,1,2,6,3,4符合广度优先遍历顺序
附上搜寻的图:

数据结构之图:图的搜索,Python代码实现——23相关推荐

  1. get占位符传多个参数_未知环境下的Lidar概率占位栅格图(Occupancy Grid Map) Python代码实现...

    自动驾驶Mapping-占位栅格图(Occupancy Grid Map)中介绍了概率占位栅格地图(Probabilistic Occupancy Grid)的原理,并推导了如何利用贝叶斯理论(Bay ...

  2. python中outside loop_未知环境下的Lidar概率占位栅格图(Occupancy Grid Map) Python代码实现...

    自动驾驶Mapping-占位栅格图(Occupancy Grid Map)中介绍了概率占位栅格地图(Probabilistic Occupancy Grid)的原理,并推导了如何利用贝叶斯理论(Bay ...

  3. 一个dht网络的“磁力链接”搜索python代码

    这个python代码是用来从DHT网络(一种分布式的"磁力链接"的共享网络,这个叫法是我个人对这种分布式网络的称呼)中,检测收集"磁力链接".每一个磁力链接就对 ...

  4. 八数码宽度优先搜索python代码_图之遍历--广度优先遍历

    何为广度优先遍历呢? 广度优先遍历(BFS),又叫宽度优先搜索或横向优先搜索,是从根结点开始沿着树的宽度搜索遍历,将离根节点最近的节点先遍历出来,在继续深挖下去. 基本思想是: 1.从图中某个顶点V0 ...

  5. python代码做图_如何用Python代码制作图

    Python是一种跨平台的计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的.大型项目的开发. 图是一 ...

  6. 图的广度优先搜索--python实现

    最近在看<算法图解>,第六章中的广度优先搜索中的题目.自己实现一遍,算是做个记录吧. 关系网络图如下: 目的:找到朋友与朋友的朋友这些人中,谁是 Seller. 大体思路: 首先使用散列表 ...

  7. bland c++_为什么要使用bland altman图进行ab测试python代码

    bland c++ 目录(Table of contents) Why using the Bland-Altman plot 为什么要使用Bland-Altman图 The used data 使用 ...

  8. python实现p图软件_10行Python代码实现美图秀秀

    美图秀秀相信大家都不陌生,大家只要操作美图秀秀,就可以P掉图片中脸上的一些瑕疵,让人变得更加的美丽.今天小编就带领大家来借助Python和Flask来实现一个美图秀秀的网页设计,大家只需要通过网页上传 ...

  9. 搜索python代码的软件_用python编写一个高效搜索代码工具

    用python编写一个高效搜索代码工具 大多码农在linux环境下使用grep+关键词的命令搜索自己想要的代码或者log文件.今天介绍用python如何编写一个更强大的搜索工具,windows下也适用 ...

最新文章

  1. Linux思维导图整理,你确定不收藏?
  2. AspectCore中的IoC容器和依赖注入
  3. linux内核打印前有buildroot,buildroot-linux内核
  4. linux 内核宏container_of剖析
  5. 【客户案例】智能驾驶行业如何上云? 1
  6. 4 5区别 angular 和_初探Angular的更新机制
  7. 源码编译安装keepalived
  8. java for循环效率优化_java 优雅代码for循环 之性能调优
  9. 常见HTTP状态(304,200等)转
  10. NP、OSPF路由聚合
  11. hcfax2e伺服驱动器说明书_伺服电机说明书
  12. Matlab三位曲线之plot3函数
  13. 靠一套PPT上市估值120亿:新能源韭菜的自我修养
  14. Unity3D游戏开发之游戏模型制作:机器人
  15. Unity2D 简易2D地图 —— 地图的显示
  16. B站怎么就成为了教育类的视频网站了
  17. python读取图片的格式_python读取图片并修改格式与大小的方法
  18. Crypto.com、Dock项目评级更新 | TokenInsight
  19. python绘制并列的条形图的方法_python matplotlib库绘制条形图练习题
  20. Spark中的Join操作及问题解决

热门文章

  1. sendBroadcast与sendStickyBroadcast的区别
  2. Flask爱家租房--发布新房源(保存房屋基本信息)
  3. 深度学习之 FPN (Feature Pyramid Networks)
  4. python99乘法表while翻译_Python学习之while练习--九九乘法表
  5. 01Pandas_数据结构
  6. ctypes python_[python学习之路]ctypes,Python
  7. Opencv 图像增强算法 图像检测结果及代码
  8. 字符数组,字符串、数字转化
  9. 网络:TCP通讯之 time_wait 状态
  10. input子系统基础之按键4——输入核心层源码分析