数据结构与算法Python版 图

文章目录

  • 一、图
  • 二、抽象数据类型图
  • 三、图的实现-邻接列表法


一、图

表示图的英文单词

  • painting:用画刷画的油画
  • drawing:用硬笔画的素描/线条画
  • picture:真实形象所反映的画,如照片等,如take picture
  • image:由印象而来的画,遥感影像做image,因是经过传感器印象而来
  • figure:轮廓图的意思,某个侧面的轮廓,所以有figure out的说法
  • diagram:抽象的概念关系图,如电路图、海洋环流图、类层次图
  • chart:由数字统计来的柱状图、饼图、折线图
  • map:地图;plot:地图上的一小块
  • graph:重在由一些基本元素构造而来的图,如点、线段等

图Graph的例子

  • 图是比树更为一般的结构,树是一种具有特殊性质的图
  • 图可以用来表示现实世界中很多事物。例如道路交通系统、航班线路、互联网连接等
  • 公共交通:一个城市的公交系统有数百条运营线路,公交站点数千个
  • 互联网:一张百亿个信息点的巨型网络
  • 社交网络:六度分隔理论,世界上任何两个人之间通过最多6个人即可建立联系

在这里插入图片描述

图的相关术语表

  • 顶点Vertex(也称“节点Node”):是图的基本组成部分,顶点具有名称标识Key,也可以携带数据项payload
  • 边Edge(也称“弧Arc”):作为2个顶点之间关系的表示,边连接两个顶点;边可以是无向或者有向的,相应的图称作“无向图”和“有向图”
  • 权重Weight:为了表达从一个顶点到另一个顶点的**“代价”**,可以给边赋权;例如公交网络中两个站点之间的“距离”、“通行时间”和“票价”都可以作为权重。
  • 图的定义:一个图G可以定义为G=(V, E),其中V是顶点的集合,E是边的集合,E中的每条边e=(v, w),v和w都是V中的顶点;
  • 子图:V和E的子集
  • 赋权图:在E中的每条边e=(v, w)中添加权重分量,如果边是有向的,叫有向赋权图
  • 路径Path:图中的路径,是由边依次连接起来的顶点序列;无权路径的长度为边的数量;带权路径的长度为所有边权重的和
  • 圈Cycle:圈是首尾顶点相同的路径
  • 有向无环图(directed acyclic graph: DAG):如果一个有向图不存在任何圈,则称为有向无环图

在这里插入图片描述

二、抽象数据类型图

抽象数据类型图(ADT Graph)

方法名描述
Graph()创建一个空的图
addVertex(vert)将顶点vert加入图中
addEdge(fromVert, toVert)添加有向边,从fromVert指向toVert
addEdge(fromVert, toVert, weight)添加带权的有向边,从fromVert指向toVert,并指定权重weight
getVertex(vKey)查找名称为vKey的顶点
getVertices()返回图中所有顶点的列表
in按照vert in graph的语句形式,返回顶点vert是否存在图中,返回True或False

抽象数据类型图的实现方法

  • 方法一:邻接矩阵 Adjacency Matrix
  • 方法二:邻接表 Adjacency List

邻接矩阵

  • 矩阵的每行和每列都代表图中的顶点
  • 如果两个顶点之间有边相连,设定行列值。无权边则将矩阵分量标注为1;带权边则将矩阵分量标注为权重
  • 优点是简单,缺点效率低。大多数问题所对应的图都是稀疏sparse的,即边远远少于顶点数量平方这个量级

在这里插入图片描述

邻接列表

  • 维护一个包含所有顶点的主列表(master list),主列表中的每个顶点,再关联一个与自身有边连接的所有顶点的列表
  • 优点存储空间紧凑高效

在这里插入图片描述

三、图的实现-邻接列表法

顶点Vertex类:含了顶点信息,以及顶点连接边信息

class Vertex:
    """顶点类"""

    def __init__(self, key):
        self.key = key
        self.connected_to = {}

    def add_neighbor(self, nbr, weight=0):
        """键为nbr顶点对象,值为权重"""
        self.connected_to[nbr] = weight

    def __str__(self):
        return f"{self.key} connected to : {[x.key for x in self.connected_to]}"

    def get_connections(self):
        return self.connected_to.keys()

    def get_key(self):
        return self.key

    def get_weight(self, nbr):
        return self.connected_to.get(nbr, None)

图Graph类:Graph保存了包含所有顶点的主表

class Graph:
    def __init__(self):
        self.vertexes = {}
        self.num_vertexes = 0

    def add_vertex(self, key):
        """加入顶点:以key为键,以Vertex对象为值"""
        self.num_vertexes += 1
        new_vertex = Vertex(key)
        self.vertexes[key] = new_vertex
        return new_vertex

    def get_vertex(self, key):
        if key in self.vertexes:
            return self.vertexes[key]
        else:
            return None

    def __contains__(self, key):
        return key in self.vertexes

    def add_edge(self, begin, end, cost=0):
        """添加边,如果顶点不存在,先添加顶点再加边"""
        if begin not in self.vertexes:
            self.add_vertex(begin)
        if end not in self.vertexes:
            self.add_vertex(end)
        self.vertexes[begin].add_neighbor(self.vertexes[end], cost)

    def get_vertexes(self):
        """返回所有顶点"""
        return self.vertexes.keys()

    def __iter__(self):
        return iter(self.vertexes.values())


g = Graph()
for i in range(6):
    g.add_vertex(i)
print(g.get_vertexes())

g.add_edge(0, 1, 5)
g.add_edge(0, 5, 2)
g.add_edge(1, 2, 4)
g.add_edge(2, 3, 9)
g.add_edge(3, 4, 7)
g.add_edge(3, 5, 3)
g.add_edge(4, 0, 1)
g.add_edge(5, 4, 8)
g.add_edge(5, 2, 1)

for v in g:
    for w in v.get_connections():
        print(f"({v.get_key()},{w.get_key()})")
        
        
### 输出结果
dict_keys([0, 1, 2, 3, 4, 5])
(0,1)
(0,5)
(1,2)
(2,3)
(3,4)
(3,5)
(4,0)
(5,4)
(5,2)

您正在阅读的是《数据结构与算法Python版》专栏!关注不迷路~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Word表格另起一页解决办法

Word表格另起一页解决办法 表格设置根据内容自动调整,取消指定高度第1步 第2步

Python数据可视化案例——折线图

目录 json介绍: Pyecharts介绍 安装pyecharts包? 构建一个基础的折线图 配置全局配置项 综合案例: 使用工具对数据进行查看?: 数据处理 json介绍: json是一种轻量级的数据交互格式,采用完全独立于编程语言的…

【Seata】seata的部署和集成

一、部署Seata的tc-server 1.下载 首先我们要下载seata-server包,地址在http://seata.io/zh-cn/blog/download.html 当然,课前资料也准备好了: 2.解压 在非中文目录解压缩这个zip包,其目录结构如下: 3.修改配置 修…

链表 之 无头结点【哨兵位】单向非循环链表【单链表】增删改查 等方法

系列文章目录 🎈 🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼 🎉🎉我的C语言初阶合集:C语言初阶合集,希望能…

GCP Cloud Architect exam - PASS

备考指南 推荐视频课程 https://www.udemy.com/course/google-cloud-architect-certifications/?couponCodeKEEPLEARNING 推荐题库 https://www.udemy.com/course/gcp-professional-cloud-architect-exam-practice-tests-2024​/?couponCodeKEEPLEARNING 错题集 http…

CCF-GESP 等级考试 2023年12月认证C++二级真题解析

2023年12月真题 一、单选题(每题2分,共30分) 正确答案:C 考察知识点:变量的定义与使用 解析:变量命名规则:1、只能包括数字、字母和下划线;2、不能以数字开头;3、不能和…

5.学习webpack配置 babel基本配置

babel是一个javascript编译工具,其主要功能是将新版本的JavaScript代码(如es6)转换为旧版本的代码(如es5),以便能够在旧版本的浏览器或环境中运行。一般配合webpack使用。 使用npm i -D babel/core babel/p…

配置搜索无人机

升级ubuntu内核 https://www.bilibili.com/video/BV11X4y1h7qN/?spm_id_from333.337.search-card.all.click 进入四个内核文件并安装 sudo dpkg -i *.deb安装ROS,PX4,XTDrone,QGC https://blog.csdn.net/qq_45493236/article/details/13…

Linux内核蓝牙子系统有什么(9)

接前一篇文章:Linux内核蓝牙子系统有什么(8) 本文内容参考: Linux之蓝牙相关代码浅析 | DDNotes 蓝牙驱动相关代码_蓝牙驱动代码-CSDN博客 linux蓝牙驱动代码阅读笔记_bt-sco.c-CSDN博客 Linux内核的蓝牙子系统架构-CSDN博客 …

22. 仿LISP运算

题目描述 LISP语言唯一的语法就是括号要配对 形如(OP P1 P2 ...),括号内元素由单个空格分割。其中第一个元素OP为操作符,后续元素均为其参数,参数个数取决于操作符类型。注意:参数P1,P2也有可能是另外一个嵌套的(OP P1 P2...),当前…

Axure10

如果还是不行就将字体图标安装在控制面板–字体下 打开原型了之后,icon没有 一定要将字体库放到–》控制面板\外观和个性化\字体 里面

王佩丰24节Excel学习笔记——第十九讲:Indirect函数

【以 Excel2010 系列学习,用 Office LTSC 专业增强版 2021 实践】 【本章技巧】 如果indirect引用出错,首先检查一下引用位置的双引号有没有出错,再检查引用值的位置是否出错,如果是双引号出错,可以使用英文状态下输入…

基于 Ragflow 搭建知识库-初步实践

基于 Ragflow 搭建知识库-初步实践 一、简介 Ragflow 是一个强大的工具,可用于构建知识库,实现高效的知识检索和查询功能。本文介绍如何利用 Ragflow 搭建知识库,包括环境准备、安装步骤、配置过程以及基本使用方法。 二、环境准备 硬件要…

Structured-Streaming初识

一、概览 Structured Streaming是一个基于SparkSQL引擎构建的可扩展且容错的流处理引擎。可以像在静态数据上表达批量计算一样表达流计算。SparkSQL引擎将负责以增量方式连续运行它,并在流数据继续到达时更新最终结果。可以使用Scala、Java、Python或R中的Dataset/…

Gradio全解系列——Additional Features:附加功能(上)

Gradio全解系列——Additional Features:附加功能(上) 前言本篇摘要10. Additional Features:附加功能10.1 队列10.1.1 使用方法10.1.2 配置队列 10.2 流输入输出10.2.1 流输出1. 生成器yield2. 流媒体 10.2.2 流输入1. 流事件2. …

TestMAX/DFT Compiler:时序单元的类型、连接顺序和后DFT优化

相关阅读 TestMAX/DFT Compilerhttps://blog.csdn.net/weixin_45791458/category_12865937.html?spm1001.2014.3001.5482 时序单元的状态 未映射的时序单元(Unmapped Sequential Cell) 在Design Compiler读取了一个RTL设计后,Design Compiler内置的HDL Compiler工…

Cocos Creator 3.8.5 正式发布,更小更快更多平台!

在 Cocos Creator 3.8.5 版本中,我们做了新一轮的优化。 在加载速度、代码裁剪、平台增强等多方面做了优化,提升了开发者体验和游戏性能。 希望能够助 Cocos 开发者们的产品更上一层楼。 一、加载速度优化 1、WASM 模块延迟加载 在早期版本中&#xff0c…

跨语言数据格式标准化在 HarmonyOS 开发中的实践

文章目录 前言数据格式标准化的意义数据传递中的痛点标准化的优势 JSON 与 Protocol Buffers 的比较JSONProtocol Buffers HarmonyOS 跨语言数据传递示例示例代码:定义 Protocol Buffers 消息格式生成 Java 和 C 代码示例代码:Java 端序列化与传递数据C …

【有作图代码】多尺度动力学模型:像“显微镜与望远镜的结合”,揭示微观分子运动与宏观流体流动的奥秘

【有作图代码】多尺度动力学模型:像“显微镜与望远镜的结合”,揭示微观分子运动与宏观流体流动的奥秘 具体实例与推演 假设我们有一个流体系统,其中微观尺度上分子间的相互作用可以通过分子动力学方程描述,而宏观尺度上流体的流…

工具变量笔记

补充知识 简单介绍工具变量 假设 Y i α β D i ϵ i Y_i\alpha\beta D_i\epsilon_i Yi​αβDi​ϵi​, where E ( ϵ i ∣ D i ) 0 E(\epsilon_i\mid D_i)0 E(ϵi​∣Di​)0. 但是通常这个条件不满足。于是假如有这样一个工具变量 Z i Z_i Zi​存在的话,满…