概念

  • 图Graph是比树更为一般的结构, 也是由节点和边构成

    实际上树是一种具有特殊性质的图
  • 图可以用来表示现实世界中很多有意思的事物,包括道路系统、城市之间的航班、互联网的连接,甚至是计算机专业的一系列必修课

定义

  • 一个图G可以定义为G=(V, E)

    • 其中V是顶点的集合, E是边的集合, E中的每条边e=(v, w), v和w都是V中的顶点;
    • 如果是赋权图,则可以在e中添加权重分量子图: V和E的子集

术语表

  • 顶点Vertex(也称“节点Node”)

    是图的基本组成部分,顶点具有名称标识Key,也可以携带数据项payload

  • 边Edge(也称“弧Arc”)

    作为2个顶点之间关系的表示,边连接两个顶点;



  • 可以是无向或者有向的,相应的图称作“无向图”和“有向图”

  • 权重Weight

    为了表达从一个顶点到另一个顶点的“代价”,可以给边赋权;例如公交网络中两个站点之间的“距离”、“通行时间”和“票价”都可以作为权重

  • 路径Path

    图中的路径,是由边依次连接起来的顶点序列;无权路径的长度为边的数量;带权路径的长度为所有边权重的和;

  • 环(圈Cycle)

    • 环是有向图中的一条起点和终点为同一个顶点的路径。
    • 没有环的图被称为无环图,没有环的有向图被称为有向无环图,简称为DAG

图的抽象数据类型

  • Graph()新建一个空图。

  • addVertex(vert)向图中添加一个顶点实例。

  • addEdge(fromVert, toVert)向图中添加一条有向边,用于连接顶点fromVert和toVert。

  • addEdge(fromVert, toVert, weight)向图中添加一条带权重weight的有向边,用于连接顶点fromVert和toVert。

  • getVertex(vertKey)在图中找到名为vertKey的顶点。

  • getVertices()以列表形式返回图中所有顶点。

  • in通过vertex in graph这样的语句,在顶点存在时返回True,否则返回False。

实现方法

  • 邻接矩阵adjacency matrix
  • 邻接表adjacency list

两种方法各有优劣,需要在不同应用中加以选择

邻接矩阵Adjacency Matrix

  • 矩阵的每行和每列都代表图中的顶点
  • 如果两个顶点之间有边相连, 设定行列值
    • 无权边则将矩阵分量标注为1,或者0
    • 带权边则将权重保存为矩阵分量值
  • 优点是简单,可以很容易得到顶点是如何相连
  • 但如果图中的边数很少则效率低下

    成为“稀疏sparse”矩阵,而大多数问题所对应的图都是稀疏的

邻接列表Adjacency List

  • 邻接列表adjacency list可以成为稀疏图的更高效实现方案

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

    很容易获得顶点所连接的所有顶点,以及连接边的信息

代码

class Vertex:
def __init__(self, key):
self.id = key
self.connectedTo = {} def addNeigbor(self, nbr, weight=0):
'''nbr是顶点对象的key'''
self.connectedTo[nbr] = weight def __str__(self):
return str(self.id)+' connectedTo: ' + str([x.id for x in self.connectedTo]) def getConnections(self):
return self.connectedTo.keys() def getId(self):
return self.id def getWeight(self, nbr):
return self.connectedTo[nbr] class Graph:
def __init__(self):
self.vertList = {}
self.numVertices = 0 def addVertex(self, key):
self.numVertices += 1
newVertex = Vertex(key)
self.vertList[key] = newVertex
return newVertex def getVertex(self, key):
if key in self.vertList:
return self.vertList[key]
else:
return None def __contains__(self, key):
return key in self.vertList def addEdge(self, f, t, cost=0):
# 不存在的点先添加
if f not in self.vertList:
nv = self.addVertex(f)
if t not in self.vertList:
nv = self.addVertex(t)
# 调用起始顶点的方法添加邻接边
self.vertList[f].addNeigbor(self.vertList[t], cost) def getVertices(self):
return self.vertList.keys() def __iter__(self):
return iter(self.vertList.values()) if __name__ == "__main__":
g = Graph()
for i in range(6):
g.addVertex(i)
print(g.vertList[i]) # print(g.vertList) g.addEdge(0, 1, 5)
g.addEdge(0, 5, 2)
g.addEdge(1, 2, 4)
g.addEdge(2, 3, 9)
for v in g:
for w in v.getConnections():
print("%s,%s" % (v.getId(), w.getId())) for i in range(6):
print(g.vertList[i])
>>>
0 connectedTo: []
1 connectedTo: []
2 connectedTo: []
3 connectedTo: []
4 connectedTo: []
5 connectedTo: []
0,1
0,5
1,2
2,3
0 connectedTo: [1, 5]
1 connectedTo: [2]
2 connectedTo: [3]
3 connectedTo: []
4 connectedTo: []
5 connectedTo: []

【数据结构与算法Python版学习笔记】图——基本概念及相关术语的更多相关文章

  1. 【数据结构与算法Python版学习笔记】引言

    学习来源 北京大学-数据结构与算法Python版 目标 了解计算机科学.程序设计和问题解决的基本概念 计算机科学是对问题本身.问题的解决.以及问题求解过程中得出的解决方案的研究.面对一 个特定问题,计 ...

  2. 【数据结构与算法Python版学习笔记】目录索引

    引言 算法分析 基本数据结构 概览 栈 stack 队列 Queue 双端队列 Deque 列表 List,链表实现 递归(Recursion) 定义及应用:分形树.谢尔宾斯基三角.汉诺塔.迷宫 优化 ...

  3. 【数据结构与算法Python版学习笔记】图——强连通分支

    互联网 我们关注一下互联网相关的非常巨大图: 由主机通过网线(或无线)连接而形成的图: 以及由网页通过超链接连接而形成的图. 网页形成的图 以网页(URI作为id)为顶点,网页内包含的超链接作为边,可 ...

  4. 【数据结构与算法Python版学习笔记】图——最短路径问题、最小生成树

    最短路径问题 概念 可以通过"traceroute"命令来跟踪信息传送的路径: traceroute www.lib.pku.edu.cn 可以将互联网路由器体系表示为一个带权边的 ...

  5. 【数据结构与算法Python版学习笔记】图——拓扑排序 Topological Sort

    概念 很多问题都可转化为图, 利用图算法解决 例如早餐吃薄煎饼的过程 制作松饼的难点在于知道先做哪一步.从图7-18可知,可以首先加热平底锅或者混合原材料.我们借助拓扑排序这种图算法来确定制作松饼的步 ...

  6. 【数据结构与算法Python版学习笔记】图——骑士周游问题 深度优先搜索

    骑士周游问题 概念 在一个国际象棋棋盘上, 一个棋子"马"(骑士) , 按照"马走日"的规则, 从一个格子出发, 要走遍所有棋盘格恰好一次.把一个这样的走棋序列 ...

  7. 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS

    词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...

  8. 【数据结构与算法Python版学习笔记】查找与排序——散列、散列函数、区块链

    散列 Hasing 前言 如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度. 现在我们进一步来构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为" ...

  9. 【数据结构与算法Python版学习笔记】算法分析

    什么是算法分析 算法是问题解决的通用的分步的指令的聚合 算法分析主要就是从计算资源的消耗的角度来评判和比较算法. 计算资源指标 存储空间或内存 执行时间 影响算法运行时间的其他因素 分为最好.最差和平 ...

随机推荐

  1. Netty ServerBootstrap如何绑定端口

    这篇讲netty服务端ServerBootstrap如何启动 前言 BootStrap在netty的应用程序中负责引导服务器和客户端.netty包含了两种不同类型的引导: 使用服务器的ServerBo ...

  2. Dockerfile简介及基于centos7的jdk镜像制作

    Dockerfile简介 dockerfile 是一个文本格式的配置文件, 用户可以使用 Dockerfile 来快速创建自定义的镜像, 另外,使用Dockerfile去构建镜像好比使用pom去构建m ...

  3. Hive的分桶表

    [分桶概述] Hive表分区的实质是分目录(将超大表的数据按指定标准细分到指定目录),且分区的字段不属于Hive表中存在的字段:分桶的实质是分文件(将超大文件的数据按指定标准细分到分桶文件),且分桶的 ...

  4. Python - poetry(4)管理环境

    环境隔离 poetry 核心之一:使项目环境隔离,意味着始终和本地全局 Python 环境隔离 poetry 首先会检查当前项目是否在虚拟环境中运行:如果是将直接使用它,而不创建新的:如果不是,poe ...

  5. golang接口类型判断 VS 接口类型查询

    接口类型判断:接口.(类型) 1.类型查询:查询接口数据对应的类型是否是指定的类型 2.类型转化:如果是指定类型,就将数据转化为接口类型查询: 1.reflect.TypeOf(接口) 2.接口.(T ...

  6. java线程day-01

    综述:下面写的是我学习java线程时做的一些笔记和查阅的一些资料总结而成.大多以问答的形式出现. 一.什么是线程? 答:线程是一个轻量级的进程,现在操作系统中一个基本的调度单位,而且线程是彼此独立执行 ...

  7. 入坑微信小程序必经之路(六)图片上传服务器——WebSercice接口

    wxml文件 <view class="weui-uploader"> <view class="img-v weui-uploader__bd&quo ...

  8. TP5 数据保存、更新问题(save、saveAll)

    一.今天写项目的时候,突然发现一个坑爹的问题,使用saveAll新增多条数据,但是一直提示缺少更新条件,然而我发现代码里面并没有更新,而且saveAll我仅仅是去新增多条数据而已 原来源码 模型类中有 ...

  9. 华为云计算IE面试笔记-FusionCompute上的虚拟机A和虚拟机B不能正常通信,请描述可能的故障点和排除方法(分析虚拟机A和虚拟机B不通)

    *快速定位故障点:(考到) ARP:同一二层内可以通过ARP -a命令查询到要访问的主机IP(ARP表项中记录了同一二层中的IP和MAC的对应关系),若查询不到,说明二层出现问题(Vlan 间不通)或 ...

  10. 1.3redis小结--配置php reids拓展

    1.执行php文件 输出phpinfo();  <?php phpinfo(); 2.根据PHPinfo的信息确定需要下载的 php_redis.dll , php_igbinary.dll 版 ...