数据结构与算法 - 图

简介: 数据结构与算法 - 图
  1. 图的定义和基本概念
  • 图(Graph)是一种由顶点(Vertex,也称为节点 Node)和边(Edge)组成的数据结构。
    顶点是图中的基本元素,表示某个对象或实体。顶点可以用一个标识符来表示,例如一个数字或一个字符串。
    边则用于连接图中的顶点,表示顶点之间的关系。边可以是有向的,也可以是无向的。
    在无向图中,边没有方向,顶点之间的连接是双向的。如果顶点 v 和顶点 w 之间有一条无向边,那么我们可以说 vw 是相邻的,并且从 v 可以到达 w ,从 w 也可以到达 v
    在有向图中,边是有方向的,从一个顶点指向另一个顶点。如果有一条从顶点 u 到顶点 v 的有向边,我们表示为 (u, v) ,那么可以说 uv 的前驱,vu 的后继。从 u 可以沿着边到达 v ,但从 v 不一定能直接到达 u ,除非存在另一条从 vu 的有向边。

有向图(Directed Graph)和无向图(Undirected Graph)是图的两种主要类型,它们的主要区别在于边的方向性:

无向图

 

  • 边的特征:在无向图中,边没有方向,顶点之间的连接是双向的。如果存在一条连接顶点 u 和顶点 v 的边,那么既可以从 u 到达 v,也可以从 v 到达 u
  • 表示方法:通常用一对顶点来表示一条边,例如 (u, v) 表示顶点 u 和顶点 v 之间有一条边。由于边是无向的,所以 (u, v)(v, u) 表示的是同一条边。
  • 应用场景:适用于表示顶点之间对称的关系,比如朋友关系(如果 A 是 B 的朋友,那么 B 也是 A 的朋友)。
  • 有向图
  • 边的特征:在有向图中,边是有方向的,从一个顶点指向另一个顶点。如果存在一条从顶点 u 到顶点 v 的有向边,那么只能从 u 沿着边的方向到达 v,而不能从 v 沿着这条边到达 u ,除非存在另一条从 vu 的有向边。
  • 表示方法:用一个有序对来表示一条有向边,例如 (u, v) 表示从顶点 u 到顶点 v 的有向边,与 (v, u) 是不同的边。
  • 应用场景:常用于表示具有方向性的关系,比如网页中的链接(从一个网页指向另一个网页)、任务之间的依赖关系(一个任务必须在另一个任务完成后才能开始)等。

图的表示方法

  • 邻接矩阵是用一个二维矩阵来表示图的连接关系。矩阵的行和列都对应图的顶点。若顶点和顶点之间有边相连,矩阵中的值为(或边的权值),否则为。这种表示法简单直观,适用于顶点数较少的图。
  • 邻接表是一种用于表示图的常见数据结构。对于图中的每个顶点,使用一个链表或数组来存储与其相邻的顶点。
    具体来说,为图中的每个顶点创建一个链表(或动态数组)。链表(或数组)中的每个节点表示与该顶点相邻的一个顶点,并可以选择性地包含边的权值等信息。

图的遍历算法

       深度优先搜索(Depth-First Search,DFS)是一种图(或者树)的遍历算法。它从起始节点开始,沿着一条路径尽可能深地访问节点,直到无法继续或达到目标节点,然后回溯到上一个未完全探索的节点,继续探索其他路径。

DFS 的原理:

  • 选择一个起始节点并将其标记为已访问。
  • 对于该节点的未访问相邻节点,选择一个进行递归访问。
  • 重复上述过程,直到没有未访问的相邻节点,然后回溯。

DFS 的实现步骤:

  1. 访问起始节点,并将其标记为已访问。
  2. 对于起始节点的每个未访问相邻节点,进行递归的 DFS 调用。
  3. 当一个节点的所有相邻节点都已被访问,回溯到上一个节点,继续探索其他未访问的相邻节点。

以下是使用 Python 实现 DFS 的代码示例:

# 定义一个图(以邻接表的形式表示)
graph = {
    'A': ['B', 'C'],
    'B': ['D', 'E'],
    'C': ['F'],
    'D': [],
    'E': [],
    'F': []
}
 
# 用于标记已访问的节点
visited = set()
 
def dfs(node):
    if node in visited:
        return
    visited.add(node)
    print(node)
    for neighbor in graph[node]:
        dfs(neighbor)
 
# 选择一个起始节点,例如 'A'
dfs('A')

目录
相关文章
|
算法
研究生考试.数据结构与算法之十一 图
研究生考试.数据结构与算法之十一 图
54 0
|
7月前
|
存储 算法
数据结构与算法 图
数据结构与算法 图
34 0
|
存储 算法
第七章 图【数据结构与算法】3
第七章 图【数据结构与算法】3
77 0
|
算法 vr&ar
第七章 图【数据结构与算法】2
第七章 图【数据结构与算法】2
66 0
|
7月前
|
存储 人工智能 算法
第七章 图【数据结构与算法】【精致版】
第七章 图【数据结构与算法】【精致版】
83 0
|
算法 Java
图【数据结构与算法java】
图【数据结构与算法java】
55 0
|
存储 人工智能 算法
第七章 图【数据结构与算法】1
第七章 图【数据结构与算法】1
89 0
|
存储 算法
【数据结构与算法】图的概述(内含源码)
【数据结构与算法】图的概述(内含源码)
100 0
|
算法 API
【数据结构与算法】加权无线图的设计实现
【数据结构与算法】加权无线图的设计实现
132 1
【数据结构与算法】加权无线图的设计实现
|
存储 算法
数据结构/数据结构与算法实验三 图的相关算法实现
数据结构/数据结构与算法实验三 图的相关算法实现
127 0
数据结构/数据结构与算法实验三 图的相关算法实现