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

2023-11-03

无向图(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 = v
        self.edge = 0
        self.adj_list = [[] for _ in range(v)]

    def num_of_vertices(self):
        return self.vertex

    def num_of_edges(self):
        return self.edge

    def 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 += 1

    def 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 窗口多维 Tensorflow 数据集

    我有形状的二维数据m by n我想要的窗口大小w沿着第一个轴进入数据集m w许多二维数组 每个数组的大小w by n 例如如果数据是 0 1 2 3 4 5 6 7 8 9 10 11 然后我想将其窗口化 0 1 2 3 4 5 6 7 8
  • 对于 `mouseMoveEvent()` 来说鼠标移动太快

    以下是 Python 3 版本 UI XML 代码显示 4QProgessBar对于每个鼠标方向 标记为 X X Y Y 快速移动鼠标 以圆圈形式 将使 4QProgessBar上升到 99 然后是一些QProgessBar休息一下 直到鼠
  • 如何使用 eval dataframe 方法在自定义函数中返回 numpy 数组或列表?

    我正在使用 python 3 X 我正在尝试使用eval https pandas pydata org pandas docs stable generated pandas eval html pandas eval数据框方法 包括这样
  • Matplotlib 颤抖比例

    我正在尝试使用 matplotlib 和 quiver 函数绘制一些箭头 但我想使用数组单独选择每个箭头的长度 http matplotlib sourceforge net api pyplot api html matplotlib p
  • Python 比编译的 Haskell 更快?

    我有一个用 Python 和 Haskell 编写的简单脚本 它读取包含 1 000 000 个换行符分隔的整数的文件 将该文件解析为整数列表 对其进行快速排序 然后将其写入已排序的不同文件中 该文件与未排序的文件具有相同的格式 简单的 这
  • 让 argparse 收集但不响应标志

    我有一个脚本 它接受一些参数 使用其中一些参数来选择要运行的脚本 并将其余参数传递给该脚本 所以它看起来像这样 parser ArgumentParser parser add argument script choices a b par
  • 如何在Python中拟合阶跃函数

    我有一个关于使用 curve fit 等 scipy 例程拟合阶跃函数的问题 我很难将其矢量化 例如 import numpy as np from scipy optimize import curve fit import matplo
  • 在 Matplotlib 中选择标记大小

    我正在 matplotlib 中用方形标记绘制散点图 如下所示 我想实现这样的目标 这意味着我必须调整标记大小和图形大小 比例 以使标记之间没有空白 每个索引单元还应该有一个标记 x and y都是整数 所以如果y从 60 到 100 应该
  • 如何使用Python中的or-tools解决累积旅行商问题?

    累积旅行商问题 CTSP 的目标是最小化到达客户的时间总和 而不是总旅行时间 这与最小化总旅行时间不同 例如 如果一个人拥有无限的车辆 车辆与位置数量相同 并且目标是最大限度地减少到达位置的总时间 则可以为每个位置发送一辆车 因为这是满足所
  • 具有动态特性的 Python 嵌套作用域

    需要帮助理解以下句子PEP 227 http www python org dev peps pep 0227 和Python 语言参考 http docs python org reference executionmodel html
  • 优化 Django Queryset for 循环

    如何优化以下查询集 link goal for link in self child links all 我想摆脱 for 循环并只访问数据库一次 我有以下代码 class Goal models Model name models Cha
  • 这个 Python 字符串切片语句中的两个冒号的用途是什么?

    例如 str hello str 1 3 我在 Python 文档中哪里可以找到它 in 序列描述 http docs python org library stdtypes html index 510 s i j k slice of
  • 在包含缺失值的 Pandas 数据框列上使用 apply 和 lambda 函数

    这是这个问题的后续 如何根据 pandas 数据框中其他列中的子字符串创建新列 https stackoverflow com questions 70086559 how to create new column based on sub
  • 替换 Python 列表/字典中的值?

    好的 我正在尝试过滤传递给我的列表 字典并稍微 清理 它 因为其中有某些值我需要删除 所以 如果它看起来像这样 records key1 AAA key2 BBB key3 CCC key4 AAA 我如何快速轻松地运行所有内容并将 AAA
  • 如何使用包含 \n 的 .txt 创建一维列表?

    我想读取一个文本文件并将文件的每个元素放入一个列表中 而不是为文件中的每一行都有一个单独的列表 例如 如果文件是 你好我的名字 Is Joe 我希望列表是 你好 我的名字是 Joe 而不是 你好 我的名字 是乔 这是我到目前为止所拥有的 d
  • 如何通过检查传递给 pytest_runtest_teardown 的 Item 对象来确定测试是否通过或失败?

    Pytest 允许您通过实现一个名为的函数来进入每个测试的拆卸阶段pytest runtest teardown在插件中 def pytest runtest teardown item nextitem pass 是否有一个属性或方法it
  • Python Flask 不更新图像[重复]

    这个问题在这里已经有答案了 这里有一些关于图像的 Flask 问题 但没有一个能解决我的问题 我有一个应用程序可以创建图像 保存它 然后显示它 一次 它应该多次执行此操作 每次更改图像时 它应该加载新图像 它不是 它只显示与其显示的文件名关
  • 在 jupyter 笔记本中运行 pytest 测试函数

    我正在制作有关 python 测试选项的演示 我想要演示的技术之一是 pytest 我计划使用 jupyter ipython 笔记本进行演示 理想情况下 我希望能够在单元格中定义一个测试函数 然后使用 pytest 运行该函数 这样我就可
  • Python - 使用 BeautifulSoup 从 URL 列表中抓取文本的最简单方法

    使用 BeautifulSoup 从几个网页 使用 URL 列表 中抓取文本的最简单方法是什么 有可能吗 最好的 乔治娜 import urllib2 import BeautifulSoup import re Newlines re c
  • 使用和不使用 SciPy 计算 k 组合的数量

    我对这个函数感到困惑combSciPy 的 http docs scipy org doc scipy 0 14 0 reference generated scipy misc comb html看起来比简单的 Python 实现要慢 这

随机推荐

  • 接口自动化测试框架搭建【附详细搭建视频】

    如果遇到什么问题建议观看下面视频 敢称全站第一 B站最全的Python自动化测试深度学习教程 学完即就业 小白也能信手拈来 帮你少走99 的弯路 一 原理及特点 参数放在XML文件中进行管理 用httpClient简单封装一个httpUti
  • shell类型、添加PATH环境变量、.bashrc、.profile、/etc/profile、/etc/environment

    shell类型 使用 cat etc shells 查看用户的可用shell 使用 echo SHELL 查看当前正在使用的shell 打开terminal终端 shell等待用户输入 并执行输入的操作命令 这种方式叫做交互式模式 执行 s
  • C++ 并发指南 std::lock

    C 11 标准为我们提供了两种基本的锁类型 分别如下 std lock guard 与 Mutex RAII 相关 方便线程对互斥量上锁 std unique lock 与 Mutex RAII 相关 方便线程对互斥量上锁 但提供了更好的上
  • python(48): 进程,线程 ,协程

    区别 进程 拥有代码和打开的文件资源 数据资源 独立的内存空间 线程 线程从属于进程 是程序的实际执行者 一个进程至少包含一个主线程 也可以有更多的子线程 线程拥有自己的栈空间 对操作系统来说 线程是最小的执行单元 进程是最小的资源管理单元
  • Linux如何查找大文件或目录总结

    在Windows系统中 我们可以使用TreeSize工具查找一些大文件或文件夹 非常的方便高效 在Linux系统中 如何去搜索一些比较大的文件呢 下面我整理了一下在Linux系统中如何查找大文件或文件夹的方法 其实很多时候 你需要了解当前系
  • springboot jdbctemplate 实现多数据源

    1 简介 所谓多数据源 其实就是在一个项目中使用多个数据库实例中的数据库或者同一个数据库实例中多个不同的库 在大部分情况下会使用更加强大的持久化框架来访问数据库 比如MyBatis Hibernate或者Spring Data JPA等OR
  • 【论文笔记】GeneFace: Generalized and High-FidelityAudio-Driven 3D Talking Face Synthesis

    一 背景 1 1 挑战 这项工作泛化能力弱 存在的两个挑战 1 训练数据规模小 2 容易产生 平均脸 音频到其对应的面部运动是一对多映射 这意味着相同的音频输入可能具有多个正确的运动模式 使用基于回归的模型学习此类映射会导致过度平滑和模糊结
  • Ubuntu-14.04.5-server安装Tomcat7.0.52

    背景 部署项目需要安装的Tomcat版本为 apache tomcat 7 0 52 tar gz 本文记录安装Tomcat的步骤如下 1 下载Tomcat 访问官网 找到 apache tomcat 7 0 52 tar gz 下载tar
  • es6选择题(带答案)

    es6选择题 1 下面不属于ECMAScript规范的范围的是 A 数据类型 B 语法 C DOM事件 D 内置对象和函数的标准库 答案 C 解析 DOM事件不属于ECMAScript的部分 ECMAScript定义的内容 语法 类型 原型
  • 图像基本处理——腐蚀和膨胀

    文章目录 一 形态学 腐蚀 二 形态学 膨胀 三 腐蚀和膨胀组合运算 一 开运算 二 闭运算 三 梯度运算 四 礼帽和黑帽 一 礼帽 二 黑帽 一 形态学 腐蚀 腐蚀就是通过卷积核 将边界部分向内部靠近 逐步腐蚀掉 opencv腐蚀函数 d
  • UE4多个分支版本兼容相同的工程dll

    如果是从源代码编译出来的UE4 明明代码完全一样 不同机器编译出来的dll却无法兼容 这对于多分支开发非常不方便 在老版本里有个通过版本号判断的逻辑 新版本改没了 分析UE4源码后发现目前是通过BulidId来判断dll跟引擎是不是兼容的
  • 树莓派4B下的usart串口测试

    树莓派4B是树莓派最新发布的版本 串口测试是新手入门的一个必经之路 鉴于网上4B资料相对较少 很多资料都是从3B或3B 上移植过来的 但平台不同 需要的操作也可能不同 这里对树莓派4B做一些总结 关于树莓派串口的问题 可参考链接 https
  • python2.6.6升级python2.7.14

    Centos 6 8系统镜像默认安装的 python 环境是 2 6 6 线上需求需要升级到 2 7 14 版本 网上找了相关资料 升级 python 版本比较容易 但 yum pip 等命令的使用也会有问题 网上的资料是修改脚本 usr
  • vue 表单提交报错:Error in v-on handler (Promise/async):“ Error: Unknown rule type String”

    如下图 原因及解决 原因 editRules 规则定义里本来就默认是String 不用再type定义一次 去掉 type String editRules active code required true type String mess
  • 面试题十道-01- 2021.11.25

    1 java8加了哪些新特性 答 jdk8引入了lambda表达式 lambda表达式实质上是一种匿名内部类 只是写法上简化了 他将原来繁琐的匿名内部类的形式缩减成较为简短的形式 由jvm进行还原 相对于匿名内部类 lambda表达式的书写
  • JSON的语法、常用类型及示例

    JSON结构 JSON结构有两种结构 就是对象和数组 通过这两种结构可以表示各种复杂的结构 province Shanxi 可以理解为是一个包含province为Shanxi的对象 Shanxi Shandong 这是一个包含两个元素的数组
  • Educoder--Java高级特性 - 多线程基础(1)使用线程

    第一题 请仔细阅读右侧代码 根据方法内的提示 在Begin End区域内进行代码补充 具体任务如下 使用继承Thread类的方式创建一个名为 ThreadClassOne 的类 重写的run方法需要实现输出0 10之间的奇数 输出结果如下
  • 开关电源原理、电路组成部分

    开关电源电路图及原理12v分析 详细版 KIA半导体的博客 CSDN博客 开关电源适配器各部分电路原理分析介绍
  • 【区块链实战】什么是 P2P 网络,区块链和 P2P 网络有什么关系

    目录 一 简介 二 知识点 P2P 网络 区块链节点与 P2P 的关系 区块链节点功能分类 P2P 网络特征 三 什么是 P2P 网络 区块链式使用 P2P 网络做什么 1 P2P 网络概念 2 P2P 网络节点特征 3 P2P 与区块链
  • 数据结构之图:无向图的介绍与功能实现,Python——22

    无向图 Undigraph 的介绍 引入 生活中的图 有地图 集成电路板的图 可以看类似的看做是数据结构中的图 数据有 一对一 一对多 和 多对多 的关系 前两种分别表示线性表和树的存储结构性质 而多对多则可表示图的存储结构性质 定义 图是