数据结构中图的基本概念介绍

数据结构中图的基本概念

编程世界里既 “万能” 又有点 “绕” 的角色 ——图(Graph)

你可能没意识到,生活中到处都是它的影子:打开微信看的好友列表、导航软件规划的出行路线、甚至游戏里角色的移动地图,背后都藏着 “图” 的逻辑。别担心,哪怕你刚接触编程,这篇文章也会用最通俗的例子,带你一步步看懂 “图” 的本质。

为什么 “图” 如此重要?先看 3 个生活场景

先别急着记定义,我们先想几个日常问题:

  • 微信里,怎么判断 “我” 和 “陌生好友” 之间隔了几个人?
  • 从家到公司,导航怎么选 “最快” 或 “最短” 的路线?
  • 网页里点一个链接跳转到另一个,这些链接是怎么串联起来的?

这些问题的核心,其实都是 “事物之间的关系”:人与人的关系、地点与地点的关系、网页与网页的关系。而 “图”,正是专门用来描述这种 “复杂关系” 的数据结构 —— 它能把零散的 “点”(事物)用 “线”(关系)串起来,让我们清晰地看到背后的连接逻辑。

一、图的基本构成:就 2 个核心元素

图的本质特别简单,只需要两个东西就能构成,就像 “乐高积木” 的基础块:

1. 顶点(Vertex / Node):“事物” 本身

  • 定义:代表一个独立的 “实体” 或 “对象”,是图的 “基本单位”。
  • 例子:微信里的一个人、地图上的一个城市、网页里的一个页面、电路板上的一个元件。
  • 图示:在画图时,通常用「圆圈」或「圆点」表示(比如用○代表 “小明”,○代表 “小红”)。

2. 边(Edge):“事物之间的关系”

  • 定义:连接两个顶点的 “线”,代表顶点之间的关联。
  • 例子:小明和小红是好友(边连接两人)、北京到上海有高铁(边连接两座城市)、网页 A 链接到网页 B(边连接两个网页)。
  • 图示:用「直线」或「箭头」表示(具体用哪种,后面会讲)。

一句话总结:图 = 一堆顶点(○) + 一堆连接顶点的边(— 或→)。

生活小案例:画一张 “朋友圈图”

假设我们有 3 个人:小明、小红、小刚。

  • 顶点:○小明、○小红、○小刚
  • 边:如果小明和小红是好友,就用直线连起来(小明 — 小红);如果小红和小刚是好友,再连一条(小红 — 小刚)。
    这样一来,一张简单的 “朋友关系图” 就画好了 —— 你能一眼看出谁和谁有关系,关系是怎样的。

二、图的 “性格”:有向图 vs 无向图

边不仅能 “连接”,还能体现 “关系的方向”—— 这就像 “朋友” 和 “粉丝” 的区别:朋友是双向的,粉丝是单向的。根据边的方向性,图能分成两大类:

1. 无向图(Undirected Graph):“双向关系”

  • 核心特点:边没有方向,关系是 “对称的”“双向的”。
  • 例子
    • 朋友关系:小明是小红的朋友,小红肯定也是小明的朋友(总不能 “我把你当朋友,你没把我当朋友” 吧?)。
    • 城市间的普通公路:从北京能开车到天津,从天津也能开回北京。
  • 图示:边用「直线」表示(比如 小明 — 小红)。

2. 有向图(Directed Graph / Digraph):“单向关系”

  • 核心特点:边有方向,关系是 “不对称的”“单向的”。
  • 例子
    • 关注关系:你在抖音关注了某个博主,但博主不一定关注你(单向的 “粉丝 - 博主” 关系)。
    • 单行道:从学校门口的路口 A 能到路口 B,但路口 B 不能直接回路口 A。
    • 网页链接:网页 A 有一个链接指向网页 B,但网页 B 可能根本没提网页 A。
  • 图示:边用「带箭头的直线」表示(比如 你→博主,A→B)。

关键区别记牢:无向图的边是 “友谊”(双向),有向图的边是 “关注” 或 “单行道”(单向)。

三、边的 “重量”:加权图 vs 无权图

有时候,光知道 “两个顶点有关系” 还不够,我们还想知道 “关系有多强”“连接的成本有多高”—— 这就需要给边加一个 “权重”。

1. 加权图(Weighted Graph):边有 “数值属性”

  • 定义:给每条边赋予一个具体的数值(比如距离、时间、成本),这个数值就叫 “权重(Weight)”。
  • 权重的意义:根据场景不同,权重可以代表不同含义:
    • 导航场景:边(道路)的权重 = 距离(比如北京到天津的边,权重 = 137 公里)或时间(权重 = 2 小时)。
    • 通信场景:边(网线)的权重 = 带宽(比如 100Mbps)或延迟(比如 20ms)。
    • 社交场景:边(好友关系)的权重 = 亲密度(比如小明和小红经常聊天,权重 = 90;小明和小刚很少联系,权重 = 30)。
  • 图示:在边的旁边标注数值(比如 北京 —137km— 天津,你→5(亲密度)→小红)。

2. 无权图(Unweighted Graph):边没有 “数值属性”

  • 定义:所有边的权重都默认是 1(或不明确标注权重),只关心 “有没有连接”,不关心 “连接的代价”。
  • 例子:微信好友图(只需要知道 “是不是好友”,不需要算 “亲密度”)、网页链接图(只需要知道 “有没有链接”,不需要管 “链接的点击量”)。

为什么加权图很重要? 因为它能更贴近现实需求。比如导航软件找 “最短路径”,本质就是在加权图里找 “权重之和最小的路径”(比如总距离最短,或总时间最少)。

四、顶点的 “活跃度”:度、入度、出度

怎么判断一个顶点在图里 “是否重要”?比如微信里谁的好友最多?抖音里谁的粉丝最多?这就需要用 “度” 来衡量。

注意:“度” 的定义在无向图和有向图里不一样,别搞混!

1. 无向图:用 “度(Degree)” 衡量

  • 定义:一个顶点连接的边的数量,就是这个顶点的 “度”。
  • 例子:在朋友圈图里,小明连接了小红、小刚、小丽 3 个人(3 条边),那小明的 “度” 就是 3(意味着他有 3 个好友)。

2. 有向图:用 “入度” 和 “出度” 衡量

有向图的边有方向,所以要分开看 “进来的边” 和 “出去的边”:

  • 入度(In-Degree):指向该顶点的边的数量(“进来的关系”)。
    例子:抖音博主的 “入度”= 粉丝数(比如有 1000 人关注他,入度 = 1000)。
  • 出度(Out-Degree):从该顶点出发的边的数量(“出去的关系”)。
    例子:你的抖音 “出度”= 你关注的人数(比如你关注了 200 个博主,出度 = 200)。

一句话总结:无向图里,顶点的 “活跃度” 看 “度”;有向图里,看 “入度”(被多少人关注)和 “出度”(关注了多少人)。而且有个小规律:无向图的 “度”,其实等于有向图里 “入度 + 出度”(如果把无向边拆成两个方向的有向边)。

五、图中的 “旅程”:路径与连通性

图最常用的场景之一,就是 “找路线”—— 比如从 A 到 B 怎么走?有没有能走的路?这就需要理解 “路径” 和 “连通性”。

1. 路径(Path):从 A 到 B 的 “路线”

  • 定义:从一个顶点(起点)出发,沿着边(可以是无向边或有向边,有向边要顺着箭头方向)经过一系列顶点,最终到达另一个顶点(终点)的 “序列”。
  • 例子
    • 导航场景:从家(A)→ 地铁站 C → 地铁站 D → 公司(B),这就是一条 “家到公司” 的路径。
    • 社交场景:小明→小红→小刚,这是一条 “小明到小刚” 的路径(意味着小明可以通过小红认识小刚)。
  • 注意:路径可以有长度(比如经过 3 条边,路径长度就是 3),也可以有 “总权重”(比如导航路径的总距离 = 各边权重之和)。

2. 连通性:图是不是 “连在一起”

连通性描述的是 “图里的顶点能不能互相到达”,无向图和有向图的定义也不同:

(1)无向图的连通性
  • 连通图(Connected Graph):图里任意两个顶点之间,都存在至少一条路径(比如整个微信好友图,如果任意两个人都能通过 “好友的好友” 联系上,就是连通图)。
  • 非连通图(Disconnected Graph):不是所有顶点都能互相到达,图会分成几个 “独立的小部分”,每个小部分叫 “连通分量”。
    例子:如果微信里有一个 “孤立的小圈子”(比如一群人只和圈子里的人加好友,不和圈子外的人联系),那整个微信好友图就是非连通图,这个小圈子就是一个 “连通分量”。
(2)有向图的连通性(稍复杂)

有向图的边有方向,所以连通性更严格:

  • 强连通:任意两个顶点 A 和 B,既能从 A 走到 B,也能从 B 走到 A(比如一个小群里,每个人都关注了其他人,就是强连通)。
  • 弱连通:如果忽略边的方向(把有向边当成无向边),图是连通的,但存在 “能从 A 走到 B,却不能从 B 走到 A” 的情况(比如你关注了博主,博主没关注你,忽略方向后你们是 “连的”,但方向上不互通)。

六、图的 “特殊亲戚”:树是一种特殊的图

你可能之前听过 “树(Tree)” 这种数据结构(比如二叉树),其实树不是独立的结构 —— 它是一种 “规则更严格的图”!

树的 3 个核心特征(缺一不可)

  1. 无向图(边没有方向);
  2. 连通图(任意两个顶点都能互相到达);
  3. 没有环(Cycle)(这是最关键的一点!)。

什么是 “环”?

环就是 “从一个顶点出发,走一圈又回到起点” 的路径,而且路径长度大于 0(不能是 “自己到自己”)。
例子:家→超市→公园→家,这就是一个环;小明 — 小红 — 小刚 — 小明,也是一个环。

树和图的关系

  • 所有树都是图(因为树满足图的定义:顶点 + 边);
  • 但不是所有图都是树(图可以有环,也可以不连通,树不行)。

简单说:树是 “最简洁的连通无向图”—— 如果在树上多一条边,就会出现环;如果少一条边,就会变成非连通图。

七、图的应用:原来我们每天都在用

理解了图的基本概念后,你会发现它的应用几乎 “无处不在”,涵盖了我们生活的方方面面:

应用领域具体场景
社交网络找 “好友的好友”、推荐可能认识的人、分析 “社交小圈子”(连通分量)
地图与导航计算最短路径(如 Dijkstra 算法)、规划避堵路线(加权图的权重 = 实时路况时间)
互联网网页爬虫(跟着网页链接的有向图爬取内容)、数据包路由(找最快的网络路径)
项目管理关键路径法(CPM)—— 用图表示任务依赖,找 “影响项目进度的核心任务”
推荐系统用户 - 物品交互图(比如 “用户 A 买了物品 B”),推荐 “相似用户喜欢的物品”
人工智能知识图谱(用图存储 “概念 - 关系”,比如 “李白 - 朝代 - 唐朝”)、游戏 AI 寻路

总结:图的本质是 “建模关系”

今天我们把图的核心概念过了一遍,其实关键就记住一句话:图是用来描述 “事物之间关系” 的数据结构

再回顾一下核心知识点:

  1. 构成:顶点(事物)+ 边(关系);
  2. 类型:按方向分(有向图 / 无向图),按权重分(加权图 / 无权图);
  3. 衡量:顶点的活跃度(度 / 入度 / 出度);
  4. 核心逻辑:路径(从 A 到 B 的路线)、连通性(能不能到)、环(绕圈);
  5. 特殊情况:树是 “无环的连通无向图”。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值