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

图的搜索

深度优先搜索(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符合广度优先遍历顺序
附上搜寻的图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dynamic_debug动态打印kernel日志

1、修改代码如下: --- a/kernel/drivers/gosodrv/touchscreen/ft5x06_ts.c+++ b/kernel/drivers/gosodrv/touchscreen/ft5x06_ts.c @@ -402,6 +402,7 @@ static void ft5x0x_ts_pen_irq_work(struct work_struct *work)struct ft5x06_ts_data *data = container_of(work, str…

PythonR语言-python和r相遇

前言 如果你是数据分析领域的新兵,那么你一定很难抉择——在进行数据分析时,到底应该使用哪个语言,R还是Python?在网络上,也经常出现诸如“我想学习机器语言,我应该用哪个编程语言”或者“我想快速解决问题…

人脸识别案例:【实战】opencv人脸检测+Haar特征分类器

1 基础 我们使用机器学习的方法完成人脸检测,首先需要大量的正样本图像(面部图像)和负样本图像(不含面部的图像)来训练分类器。我们需要从其中提取特征。下图中的 Haar 特征会被使用,就像我们的卷积核&…

Android input 子设备adb 调试命令

adb shell getevent 查看input设备属于哪一个event adb shell getevent dev/input/event1 与input event 对应的信息 rootandroid:/ # cat/proc/bus/input/devices 查看TP上报的速率: getevent -r /dev/input/event1 查看TP上报的键值:getevent -l…

数据结构之图:用图解决案例,Python代码实现——24

用图解决畅通工程案例与途径查找 代码中需要引入的类方法代码链接: 无向图Undigraph深度优先搜索DFS与广度优先搜索BFS 畅通工程-续 介绍 案例和之前并查集中实现的一样,但问题略有改动,需要判断9-10城市是否相通,9-8城市是否…

【在虚拟环境下完美解决】1698: error: (-215:Assertion failed) empty() in function cv::CascadeClassifier

问题描述 官方文档做的Demo发现遇到了错误提示如下: error: (-215:Assertion failed) !empty() in function ‘cv::CascadeClassifier::detectMultiScale’ 错误的原因: 出现 error: (-215:Assertion failed) !empty() in function ‘cv::CascadeClassif…

在线生成大全(这里真的什么都有)

粉丝身份证:http://id.igogo8.com/ 制作印章:http://www.makepic.com/print.php 邮址图片生成:http://www.makepic.com/email.php条形码生成:http://www.makepic.com/barcode.phpKiss学堂 颁发结业证:http://www.makep…

Git 忽略一些文件的提交

首先 git init 初始化一个git 代码仓库 git add . 向这个仓库提东西 git config --global core.excludesfile .gitignore 用.gitignore 这个文件来忽略不比较的内容 vi .gitignore /Music/res/对这个文件下的内容不进行比较然后还要 git rm --cached /Music/res/* -r …

计算机视觉概述:视觉任务+场景领域+发展历程+典型任务

一、什么是计算机视觉 定义:计算机视觉(Computer vision)是⼀⻔研究如何使机器“看”的科学,更 进⼀步的说,就是指⽤摄影机和计算机代替⼈眼对⽬标进⾏识别、跟踪和测量 等,⽤计算机处理成为更适合⼈眼观察…

数据结构之图:有向图的介绍与实现,Python代码实现——25

有向图的介绍 引入 在实际生活中,很多应用相关的图都是有方向性的,最直观的就是网络,可以从A页面通过链接跳转到B页面,那么a和b连接的方向是a->b,但不能说是b->a,此时我们就需要使用有向图来解决这一类问题,它和我们之前学习的无向图,最大的区别就在于连接是具有方向的…

Linux加载vmlinux调试

使用gdb加载内核符号表 arm-eabi-gdb out/target/product/msm8625/obj/KERNEL_OBJ/vmlinux 在内核的.config里面要打开 DEBUG_INFO和DEBUG_VM 定位故障代码 (gdb) l * qrd7627a_add_io_devices+0x100 0xc07cd05c is in qrd7627a_add_io_devices (/home/yejialong/GH700C/kernel…

图像分类_01图像分类简介:挑战+近邻分类器+CIFAR-10数据集概述

2.1.1 图像分类 任务目的:对输入的图像赋予一个标签,这个标签在指定类别集合中。 下面这个例子中,图像分类模型拍摄一张图像并将概率分配给4个标签{cat,dog,hat,mug}。如图所示,请记住&#xf…

数据结构之图:有向图的拓扑排序,Python代码实现——26

有向图的拓扑排序 拓扑排序介绍 什么是拓扑排序? 一个有向图的拓扑排序(Topological sort 或 Topological ordering)是根据其有向边从顶点U到顶点V对其所有顶点的一个线性排序举个例子:让一个拓扑排序的图中的所有顶点代表某项…

Openstack 一直在调度中解决

查看日志/var/log/nova/nova-scheduler.log,/var/log/nova/nova-compute.log,均无报错 查看/var/log/nova/nova-conductor.log报错为 2017-02-06 09:27:04.976 2206 ERROR oslo_messaging.rpc.server OperationalError: (pymysql.err.OperationalError) (1040, uToo many conne…

图像分类_02神经网络(NN)简介:定义+ 感知机+历史

2.2.1 什么是神经网络 人工神经网络( Artificial Neural Network, 简写为ANN)也简称为神经网络(NN)。是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)结构和功能的 计算模型…

【Github教程】史上最全github使用方法:github入门到精通

原文 http://www.eoeandroid.com/thread-274556-1-1.html 【初识Github】 首先让我们大家一起喊一句“Hello Github”。YEAH!就是这样。Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理。在推出后,Git在其…

图像分类_03分类器及损失:线性分类+ SVM损失+Softmax 分类+交叉熵损失

2.3.1 线性分类 2.3.1.1 线性分类解释 上图图中的权重计算结果结果并不好,权重会给我们的猫图像分配⼀个⾮常低的猫分数。得出的结果偏向于狗。 如果可视化分类,我们为了⽅便,将⼀个图⽚理解成⼀个⼆维的点,在下⾯坐标中显示如下…

数据结构之图:加权无向图与寻找最小生成树,Python——27

加权无向图与prim算法和Kruskal算法寻找最小生成树 加权无向图的介绍 引入 加权无向图是一种为每条边关联一 个权重值或 是成本的图模型。这种图能够自然地表示许多应用。在一副航空图中,边表示航线,权值则可以表示距离或是费用。在一副电路图中,边表示导线,权值则可能表示导…

课程简介

什么是网页布局? 网页布局是网页制作的基础。 DIVCSS布局网页 流式布局、浮动布局、绝对定位布局 相关知识点 标准文档流 盒子模型 float属性 position属性 三个案例 自动居中-列布局案例--盒子模型的使用方法 浮动布局案例--float属性 解决浮动影响的方法 绝对定位…

图像分类_04神经网络最优化过程:反向传播+代码实现

logistic模型原理与推导过程分析(1)https://blog.csdn.net/qq_39237205/article/details/121031296https://blog.csdn.net/qq_39237205/article/details/121031296 logistic模型原理与推导过程分析(2)https://blog.csdn.net/qq_3…