无向图(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 = [i for i in range(v)]self.v_edges = [[] 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 is equals to v -> x"""if y not in self.v_edges[x]:self.v_edges[x].append(y)if x not in self.v_edges[y]:self.v_edges[y].append(x)self.edge += 1def get_edges_of(self, v):return self.v_edges[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

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

  1. 【恋上数据结构】图基础知识介绍

    图 数据结构回顾 图(Graph) 有向图(Directed Graph) 出度.入度 无向图(Undirected Graph) 混合图(Mixed Graph) 简单图.多重图 无向完全图(Und ...

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

    有向图的拓扑排序 拓扑排序介绍 什么是拓扑排序? 一个有向图的拓扑排序(Topological sort 或 Topological ordering)是根据其有向边从顶点U到顶点V对其所有顶点的一个 ...

  3. php思维导图xmind文档,思维导图XMind特色功能介绍

    原标题:思维导图XMind特色功能介绍 XMind功能全面,易上手,深受用户的喜爱.今天在这里介绍下最新版xmind pro 7软件独有的一些特色功能. 一.同步数据至印象笔记 最新版的xmind p ...

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

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

  5. 数据结构 图的详细介绍

    图的详细介绍 1.名词解释: 图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合.在图中的数据元素,我 ...

  6. 数据结构之图的创建(邻接表)

    数据结构之图的基本概念中了解了图的基本概念,接下来对图的代码实现进行详解. 邻接无向图 1. 邻接表无向图介绍 邻接表无向图是指通过邻接表表示的无向图. 上面的图G1包含了"A,B,C,D, ...

  7. 【数据结构】图(最短路径Dijkstra算法)的JAVA代码实现

    最短路径的概念 最短路径的问题是比较典型的应用问题.在图中,确定了起始点和终点之后,一般情况下都可以有很多条路径来连接两者.而边或弧的权值最小的那一条路径就称为两点之间的最短路径,路径上的第一个顶点为 ...

  8. 大一新生必看,自学必看,里昂详解数据结构之图

    数据结构之图 有幸掌握浅薄知识,不吝分享,保持独立思考,自主学习,共同进步.另求关注,点赞,评论,感谢!(tips:主页有数据结构全部知识点,以及知识点讲解,建立完善的数据结构知识体) 核心算法思想 ...

  9. 数据结构之图:邻接矩阵和邻接表、深度优先遍历和广度优先遍历

    简介 线性表是一种线性结构,除了头结点和尾节点,线性表的每个元素都只有一个前取节点和一个后继节点.而树结构则相较于线性表更加复杂,它描述的关系为数据元素之间的父子关系,也是现实世界父子关系的缩影, 一 ...

最新文章

  1. java 自定义注解 解析_java自定义注解
  2. TensorFlow、PyTorch夹缝之下:后浪的进击和野望
  3. 【错误记录】Android Studio 编译报错 ( SDK location not found )
  4. 缺省参数-指定函数缺省参数的默认值
  5. GNU make manual 翻译(七十三)
  6. hdu5791(DP)
  7. mysql数据库优化面试redis持久化_【大厂面试06期】谈一谈你对Redis持久化的理解?...
  8. Win10取消开机密码
  9. AI-ISP,是噱头还是真能解决问题
  10. 善于总结、不断反思做更好的自己
  11. win系统连接交换机并设置固定ip地址
  12. Rest-assured框架详解
  13. unity3D 涂涂乐使用shader实现上色效果
  14. shell技巧4 - nm命令解决AppStore2.5.2被拒问题
  15. 对比Eureka和Nacos 的区别 Zuul和Spring Gateway的区别
  16. 基线校正——多项式拟合
  17. 架构学习01- 03基本原则和23个设计模式分类
  18. Netflix在亚马逊云科技上的应用和创新
  19. CSU人工智能与模式识别复习-绪论
  20. 数据基础设施白皮书2019

热门文章

  1. 家庭主机拨号上网示意图
  2. CentOS下添加Root权限用户‘超级用户’方法(xxx is not in the sudoers file.This incident will be reported.的解决方法)
  3. 泰安第一中学2021年高考成绩查询,等级考第一天结束 泰安部分考生已完成2021年高考...
  4. matlab var std,Matlab var std cov 函数解析
  5. python中opencv是什么_python-opencv的用法
  6. C# 线程池ThreadPool
  7. 使用命名空间、头文件和实现文件
  8. u3d游戏开发视频潭州_游戏美术行业的发展与应用人工智能学院专业介绍及未来前景系列报告会二...
  9. BIOS误删win10引导 delete boot option如何恢复
  10. Java编译过程(传送门)