数据结构之图:无向图的介绍与功能实现,Python——22

无向图(Undigraph)的介绍

引入

  • 生活中的图,有地图,集成电路板的图,可以看类似的看做是数据结构中的图
  • 数据有"一对一",“一对多”和“多对多”的关系,前两种分别表示线性表和树的存储结构性质,而多对多则可表示图的存储结构性质

定义

  • 图是由有限的(并且可能是可变的)组的顶点(vertices,或称点points,结点nodes),以及一系列由这些每两个顶点之间相连的有向或无向的边(edges,或称链接links,线lines),组合而成的一种数据结构

图的分类
按照连接两个顶点的边的不同,可以把图分为以下两种:

  • 无向图:边仅仅连接两个顶点,没有其他含义;
  • 有向图:边不仅连接两个顶点,并且具有方向;

图中的术语

  • 和相邻顶点: 当两个顶点通过一边相连时,我们称这两个顶点是相邻的,并且称这条边依附于这两个顶点。
  • 度:某个顶点的度就是依附于该顶点的边的个数
  • 子图:是一幅图中由一部分的边及其连接的顶点的组成的子集;
  • 路径:由边顺序连接的一系列的顶点组成
  • 环:是一条至少含有一条边且终点和起点相同的路径(示例图中的红色环)
  • 连通图:如果图中任意一个顶点都存在一条路径到达另外一 个顶点,那么这幅图就称之为连通图
  • 连通子图:一个非连通图由若干连通的部分组成,每一个连通的部分 都可以称为该图的连通子图
    在这里插入图片描述
    在这里插入图片描述

无向图

图的存储结构
要表示一幅图,只需要表示清楚以下两部分内容即可:

  1. 图中所有的顶点;
  2. 所有连接顶点的边;

常见的图的存储结构有两种:邻接矩阵和邻接表
邻接矩阵
3. 使用一个V*V的二维数组int[V][V] adj,把索引的值看做是顶点; .
4. 如果顶点v和顶点w相连,我们只需要将adj[v][w]和adj[w][v]的值设置为1,否则设置为0即可。
在这里插入图片描述
解释:
使用二维数组表示一个图,二维数组有两个维度的索引,这两套索引都表示图的顶点,当我们要查看两个顶点之间是否相连通时,例如查看顶点A是否连通顶点B(存在方向A→B),我们就查看这两个顶点一维索引A和二维索引B对应的值即可,这里我们定义如果值为1就表示连通,如果为0则表示不连通。
很明显,邻接矩阵这种存储方式的空间复杂度是V^2的,如果我们处理的问题规模比较大的话,内存空间极有可能不够用。

邻接表

  1. 使用一个大小为V的数组Queue[V] adj ,把索弓|看做是顶点; .
  2. 每个索|处adj[V]存储了一个队列,该队列中存储的是所有与该顶点相邻的其他顶点储存相连的顶点的数据结构是队列,有序的
    在这里插入图片描述
    解释:邻接表由一个数组储存图的顶点,这个数组连接了与顶点数量相同的边,这些边用队列queue存储,如果图中A顶点与B相连(无方向,互相连通),则B会出现在A顶点连接的queue中,同时A也会出现在B连接的queue中
    使用邻接表可以很大的减少不必要的空间浪费

主要方法与属性

  1. self.vertex 表示传入图中定义的顶点数量
  2. self.edge 边的数量,初始化为0,随着添加边的方法的调用而增加
  3. self.adj_list 一个列表,对应的是上图中使用的邻接表,索引代表顶点,每个索引中又储存了一个包含它的所有相邻边的列表
  4. add_edge(x, y) 将传入的两个顶点相连,构造一条边
  5. get_edges_of(v) 获取顶点v的相邻边

无向图Python代码实现与测试

class Undigraph:def __init__(self, v):self.vertex = vself.edge = 0self.adj_list = [[] for _ in range(v)]def num_of_vertices(self):return self.vertexdef num_of_edges(self):return self.edgedef add_edge(self, x: int, y: int):"""Cuz this is a undirected graph, x -> v equals to v -> x"""if y not in self.adj_list[x]:self.adj_list[x].append(y)if x not in self.adj_list[y]:self.adj_list[y].append(x)self.edge += 1def get_edges_of(self, v):return self.adj_list[v]if __name__ == '__main__':UG = Undigraph(10)UG.add_edge(2, 5)UG.add_edge(1, 4)UG.add_edge(3, 9)UG.add_edge(6, 7)UG.add_edge(2, 7)UG.add_edge(2, 8)print(UG.get_edges_of(2))print(UG.num_of_edges())print(UG.num_of_vertices())

运行结果

[5, 7, 8]
6
10

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

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

相关文章

dynmic_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…

Python学习札记(十三) Function3 函数参数二

参考:函数参数 Note A.关键字参数: 1.关键字参数:**kw 可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部…

视频操作_02视频追踪:meanshift算法+Camshift算法

1.meanshift 1.1原理 meanshift算法的原理很简单。假设你有一堆点集,还有一个小的窗口,这个窗口可能是圆形的,现在你可能要移动这个窗口到点集密度最大的区域当中。 如下图: 最开始的窗口是蓝色圆环的区域,命名为C1…

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

图的搜索 深度优先搜索(Depth First Search) 定义 从例子出发理解 DFS是一种用于遍历或搜寻树类或图类数据结构的算法,这种算法从根结点出发(如果是图,则任意选择一个顶点作为根结点),在回溯之前会尽可能地遍历每一…

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在其…