数据结构必会|图的基本概念及实现(Python)

简介: python实现图及其扩展。

1. 图的定义

​ 图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。

2. 图的基本概念

无向图

​ 如果图中任意两个顶点之间的边都是无向边(简而言之就是没有方向的边),则称该图为无向图。

在这里插入图片描述

有向图

​ 如果图中任意两个顶点之间的边都是有向边(简而言之就是有方向的边),则称该图为有向图。

在这里插入图片描述

无向完全图

​ 在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。

在这里插入图片描述

有向完全图

​ 在有向图中,如果任意两个顶点之间都存在方向互为相反的两条弧,则称该图为有向完全图。

在这里插入图片描述

3. 图的术语

  • 顶点:顶点又称为节点,是图的基础部分,我们可以给它一个名字叫“键”。
  • 边:边是图的另一个基础部分,两个顶点通过一条边相连,表示它们之间存在的关系,边既可以是单向的也可以是双向的。
  • 权重:边可以带权重,表示从一个顶点到另一个顶点的成本。
  • 路径:路径是由边连接的顶点组成的序列。
  • 环:有向图中的一条起点和终点为同一顶点的路径,没有环的图叫无环图,没有环的有向图叫有向无环图(DAG)

V = {V0, V1, V2, V3, V4, V5}

E = {(v0,v1,5), (v1,v2,4), (v2,v3,9), (v3,v4,7), (v4,v0,2),

 (v0,v5,2), (v5,v4,8), (v3,v5,3), (v5,v2,1)}

在这里插入图片描述

4. 邻接矩阵

​ 实现图最简单的方法就是邻接矩阵,在矩阵中我们用每一行每一列都表示图的一个顶点,交叉的值代表权重,示例如下:

在这里插入图片描述

5. 邻接表

​ 为了现稀疏连接的图,更高效的方式是使用邻接表,邻接表中我们为图对象所有的顶点保存一个主列表,同时为每一个顶点对象都维护一个列表,其中记录了与它相连的顶点。

<img src=" title="邻接表.png">

6. 邻接表的代码实现

# 实现邻接表
class Vertex:
    def __init__(self, key):
        self.id = key
        self.connectedTo = {}

    #从这个顶点添加一个连接到另一个
    def addNeighbor(self, nbr, weight=0):
        self.connectedTo[nbr] = weight

    # 修改str
    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 = self.numVertices + 1
        newVertex = Vertex(key)
        self.vertList[key] = newVertex
        return newVertex

    # 返回某个顶点的信息
    def getVertex(self, n):
        if n in self.vertList:
            return self.vertList[n]
        else:
            return None

    # 判断顶点是否在邻接表中
    def __contains__(self, n):
        return n in self.vertList

    # 增加边
    def addEdge(self, f, t, const=0):
        if f not in self.vertList:
            nv = self.addVertex(f)
        if t not in self.vertList:
            nv = self.addVertex(t)
        self.vertList[f].addNeighbor(self.vertList[t], const)

    # 获取所有顶点
    def getVertices(self):
        return self.vertList.keys()

    # 使用迭代器返回所有的邻接表信息
    def __iter__(self):
        return iter(self.vertList.values())
# 添加顶点
g = Graph()
for i in range(6):
    g.addVertex(i)
g.vertList
# 添加边和权重
g.addEdge(0, 1, 5)
g.addEdge(0, 5, 2)
g.addEdge(1, 2, 4)
g.addEdge(2, 3, 9)
g.addEdge(3, 4, 7)
g.addEdge(3, 5, 3)
g.addEdge(4, 0, 1)
g.addEdge(5, 4, 8)
g.addEdge(5, 2, 1)
# 打印所有的边
for v in g:
    # 获取所有顶点
    for w in v.getConnections():
        # 打印
        print("( %s , %s , %s)" % (v.getId(), w.getId(), v.getweight(w)))

# 输出
'''
( 0 , 1 , 5)
( 0 , 5 , 2)
( 1 , 2 , 4)
( 2 , 3 , 9)
( 3 , 4 , 7)
( 3 , 5 , 3)
( 4 , 0 , 1)
( 5 , 4 , 8)
( 5 , 2 , 1)
'''
# 打印某个顶点的信息
print(g.getVertex(2))
print()
# 判断某个顶点是否存在(返回True和False)
print(g.__contains__(7))
print()
# 获取所有的顶点
print(g.getVertices())
print()
# 返回邻接表信息
for v in g:
    print(v)
print()

for k,v in g.vertList.items():
    print(k,v)
    
# 输出
'''
2connectedTo[3]

False

dict_keys([0, 1, 2, 3, 4, 5])

0connectedTo[1, 5]
1connectedTo[2]
2connectedTo[3]
3connectedTo[4, 5]
4connectedTo[0]
5connectedTo[4, 2]

0 0connectedTo[1, 5]
1 1connectedTo[2]
2 2connectedTo[3]
3 3connectedTo[4, 5]
4 4connectedTo[0]
5 5connectedTo[4, 2]
'''
相关文章
|
2月前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
49 1
|
3月前
|
存储 算法
数据结构与算法学习二二:图的学习、图的概念、图的深度和广度优先遍历
这篇文章详细介绍了图的概念、表示方式以及深度优先遍历和广度优先遍历的算法实现。
73 1
数据结构与算法学习二二:图的学习、图的概念、图的深度和广度优先遍历
|
6天前
|
存储 缓存 监控
局域网屏幕监控系统中的Python数据结构与算法实现
局域网屏幕监控系统用于实时捕获和监控局域网内多台设备的屏幕内容。本文介绍了一种基于Python双端队列(Deque)实现的滑动窗口数据缓存机制,以处理连续的屏幕帧数据流。通过固定长度的窗口,高效增删数据,确保低延迟显示和存储。该算法适用于数据压缩、异常检测等场景,保证系统在高负载下稳定运行。 本文转载自:https://www.vipshare.com
101 66
|
2月前
|
存储 索引 Python
Python编程数据结构的深入理解
深入理解 Python 中的数据结构是提高编程能力的重要途径。通过合理选择和使用数据结构,可以提高程序的效率和质量
149 59
|
2月前
|
存储 开发者 Python
Python 中的数据结构与其他编程语言数据结构的区别
不同编程语言都有其设计理念和应用场景,开发者需要根据具体需求和语言特点来选择合适的数据结构
|
10天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
47 20
|
2月前
|
存储 开发者 索引
Python 中常见的数据结构
这些数据结构各有特点和适用场景,在不同的编程任务中发挥着重要作用。开发者需要根据具体需求选择合适的数据结构,以提高程序的效率和性能
|
2月前
|
存储 算法 搜索推荐
Python 中数据结构和算法的关系
数据结构是算法的载体,算法是对数据结构的操作和运用。它们共同构成了计算机程序的核心,对于提高程序的质量和性能具有至关重要的作用
|
2月前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
2月前
|
机器学习/深度学习 自然语言处理 语音技术
Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧
本文介绍了Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧,并通过TensorFlow和PyTorch等库展示了实现神经网络的具体示例,涵盖图像识别、语音识别等多个应用场景。
67 8

热门文章

最新文章