首页 > 编程语言 >数据结构与算法Python版 图

数据结构与算法Python版 图

时间:2024-12-28 19:30:44浏览次数:3  
标签:Python self add 算法 key 顶点 数据结构 vertexes def

文章目录


一、图

表示图的英文单词

  • 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版》专栏!关注不迷路~

标签:Python,self,add,算法,key,顶点,数据结构,vertexes,def
From: https://blog.csdn.net/zljgzw/article/details/144792040

相关文章

  • python3网络爬虫开发实战-第2版PDF免费下载
    适读人群:本书适合Python程序员阅读。电子版仅供预览,下载后24小时内务必删除,支持正版,喜欢的请购买正版书籍:https://item.jd.com/13527222.htmlPython之父推荐的爬虫入门到实战教程书籍,上一版销量近10万册,静觅博客博主崔庆才倾力打造,App端也能爬微软中国大数据工程师、博客......
  • python毕设 基于web的旅游网站的设计与实现程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景随着互联网技术的飞速发展,基于web的应用在各个领域广泛普及。在旅游行业,国内外对于旅游网站的研究已经取得了不少成果。现有研究主要......
  • Python读取栅格图像并对像元数据处理后导出到表格文件中
      本文介绍基于Python语言中的gdal模块,读取一景.tif格式的栅格遥感影像文件,提取其中每一个像元的像素数值,对像素值加以计算(辐射定标)后,再以一列数据的形式将计算后的各像元像素数据保存在一个.csv格式文件中的方法。  首先,我们明确一下本文的需求。现在有一个栅格遥感影像文件......
  • 基于python+Django+mysql校园二手书籍交易平台系统设计与实现
     博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩,提供核心代码讲解,答辩指导。项目配有对应开发......
  • 猫眼电影Top250:Python爬虫与数据可视化实战
    猫眼电影Top250:探索电影的魅力与深度在电影的世界里,每一部作品都是一个独特的故事,而猫眼电影Top250则是这些故事中的精华所在。猫眼电影App作为一个集在线购票、电影资讯、影迷互动等服务的一站式电影平台,不仅为用户提供了便捷的购票服务,更是一个发现好电影的绝佳去处。1......
  • 最小生成树---普里姆算法
    6-1最小生成树(普里姆算法)试实现普里姆最小生成树算法。函数接口定义:voidPrim(AMGraphG,charu);其中G是基于邻接矩阵存储表示的无向图,u表示起点裁判测试程序样例:#include<iostream>#defineMVNum10#defineMaxInt32767 usingnamespacestd;structedg......
  • Python的秘密基地--[章节8] Python 数据科学与机器学习
    第8章:Python数据科学与机器学习随着大数据和人工智能的飞速发展,Python已成为数据科学和机器学习领域的首选编程语言。本章将深入探讨Python在数据科学和机器学习中的核心工具和技术,包括数据处理、可视化以及机器学习模型的构建。8.1数据科学简介8.1.1什么是数据科......
  • python 打印圣诞树
    1.打印一棵简单的圣诞树defprint_christmas_tree(height):foriinrange(height):#打印每一层的空格print(""*(height-i-1),end="")#打印每一层的星号print("*"*(2*i+1))#打印树干for_inrange(2)......
  • WxPython跨平台开发框架之列表数据的通用打印处理
    在WxPython跨平台开发框架中,我们大多数情况下,数据记录通过wx.Grid的数据表格进行展示,其中表格的数据记录的显示和相关处理,通过在基类窗体 BaseListFrame进行统一的处理,因此对于常规的数据记录打印,我们也可以在其中集成相关的打印处理,本篇随笔介绍如何利用WxPython内置的打印数据......
  • c++使用深度优先算法和广度优先算法解决迷宫问题
    求从迷宫左上角(0,0)到右下角(M-1,N-1)的路径。MxN的迷宫如下:O代表可通行,X代表不可通行。每次只能往上下左右四个方向走一步。{'O','X','X','X','X','X','X','X''O','O','O','O','O'......