【戏玩算法】12-图

简介: 在上一篇文章中我们用了很大的篇幅来介绍红黑树,这篇文章我们来简单的学习一下图这个数据结构。
Hi~,我是 一碗周,一个在舒适区垂死挣扎的前端,如果写的文章有幸可以得到你的青睐,万分有幸~

🫐 写在前面

上一篇文章中我们用了很大的篇幅来介绍红黑树,这篇文章我们来简单的学习一下图这个数据结构。

🍊 什么是图

数据结构中的图并不是图片的图,而是网络结构的抽象模型,更具体的说图是一组由边连接的节点。

图在我们的生活中无处不在,它可以用来表示任何的二元关系,例如北京的地铁线路图:

北京地铁线路图.png

上图来源于网络,侵删

图这个数据结构还可以分为有向图无向图,所谓的有向图和无向图就是有没有方向,如下图:

01_有向图和无向图.png

每个边也可以有权重,这个权重可以说是边的值,在地图中非常有用,例如上面的地铁线路图,这个权重可以表示两个站的距离。

🍉 JavaScript表示图

JavaScript并没有图这个数据结构,我们可以使用对象和数组来构建一个图。

图的表示方式通常为两种:

  • 临界矩阵

邻接表

🍋 邻接矩阵表示法

使用邻接矩阵表示法时,我们让邻接矩阵中的每个节点和一个数组相关联,使用二维数组来表示,如下图:

02_邻接矩阵表示法.png

在上图中,二维数组中的1表示有连线,0表示没有连线。

🍌 邻接表表示法

使用邻接表表示法时,邻接表由图中每个顶点以及和顶点相邻的顶点列表组成,这个列表可以是个数组,链表字典等结构;如下图所示:

03_邻接表表示法.png

🍍 图的常用操作

图的常用操作有两个,一个深度优先遍历,一个广度优先遍历,现在用下面这个图来实现这两个遍历:

const graph = {
  A: ['B', 'D'],
  B: ['A', 'C'],
  C: ['B', 'E', 'G'],
  D: ['A'],
  E: ['C', 'F'],
  F: ['E', 'G'],
  G: ['C', 'F', 'H'],
  H: ['G'],
}
module.exports = graph

🥭 深度优先遍历

实现深度优先遍历的思路如下:

访问根节点

对根节点中没有访问过 (避免重复访问)的相邻节点进行深度优先遍历。

实现代码如下:

const graph = require('./graph')

// 记录已经访问的节点
const visited = new Set()

const dfs = n => {
  console.log(n)
  // 把已经当问的节点加入集合
  visited.add(n)
  // 访问所有节点
  graph[n].forEach(c => {
    if (!visited.has(c)) {
      dfs(c)
    }
  })
}
dfs('A')
/* * 结果* 
 A B C E F G H D* 
/

🍎 广度优先遍历

实现广度优先遍历的思路如下:

新建一个队列,把根节点入队;

把队头出队并访问;

把队头的没访问过的相邻节点入队;

重复前面两个步骤直到队列为空。

实现代码如下:

const graph = require('./graph')

// 记录已经访问的节点
const visited = new Set()
// 将根节点记录为已经访问过
visited.add('A')

// 定义一个队列
const q = ['A']
while (q.length) {
  // 队头出队
  const n = q.shift()
  console.log(n)
  // 相邻节点依次入队
  graph[n].forEach(c => {
    if (!visited.has(c)) {
      q.push(c)
      visited.add(c)
    }
  })
}
/* * 结果* 
 A B D C E G F H* 
/ 

🍏 写在最后

这篇文章就简单的介绍了一下图这个数据结构,实现了深度优先搜索和广度优先搜索两个算法。

本专栏采用JavaScript作为编程语言,从前端的角度去介绍数据结构与算法,如果对你所有帮助,可以点个关注支持一下啊\~
目录
相关文章
|
8月前
|
算法 搜索推荐 图计算
图计算中的社区发现算法是什么?请解释其作用和常用算法。
图计算中的社区发现算法是什么?请解释其作用和常用算法。
165 0
|
8月前
|
存储 算法 测试技术
☆打卡算法☆LeetCode 133. 克隆图 算法解析
☆打卡算法☆LeetCode 133. 克隆图 算法解析
|
8月前
|
存储 人工智能 算法
图与树的遍历:探索广度优先、深度优先及其他遍历算法的原理与实现
图与树的遍历:探索广度优先、深度优先及其他遍历算法的原理与实现
484 0
|
7月前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
54 4
|
6月前
|
存储 算法 Python
“解锁Python高级数据结构新姿势:图的表示与遍历,让你的算法思维跃升新高度
【7月更文挑战第13天】Python中的图数据结构用于表示复杂关系,通过节点和边连接。常见的表示方法是邻接矩阵(适合稠密图)和邻接表(适合稀疏图)。图遍历包括DFS(深度优先搜索)和BFS(广度优先搜索):DFS深入探索分支,BFS逐层访问邻居。掌握这些技巧对优化算法和解决实际问题至关重要。**
58 1
|
6月前
|
数据采集 存储 算法
「AIGC算法」图搜索算法详解
本文探讨了图搜索算法,包括遍历和最短路径搜索。DFS和BFS是遍历算法,前者使用栈深入搜索,后者用队列逐层遍历。Dijkstra、Bellman-Ford、A*、Floyd-Warshall和Johnson算法则解决最短路径问题。文中还给出了DFS的Python实现示例。这些算法在路径规划、网络分析等领域有重要应用。
204 0
|
8月前
|
存储 算法 C++
c++算法学习笔记 (8) 树与图部分
c++算法学习笔记 (8) 树与图部分
|
8月前
|
算法 数据可视化 大数据
圆堆图circle packing算法可视化分析电商平台网红零食销量采集数据
圆堆图circle packing算法可视化分析电商平台网红零食销量采集数据
|
7月前
|
算法 计算机视觉
图像处理之基于图的广度优先搜索组件标记算法
图像处理之基于图的广度优先搜索组件标记算法
42 0
|
7月前
|
存储 算法
数据结构学习记录——图应用实例-六度空间(题目描述、算法思路、伪代码及解读、图解)
数据结构学习记录——图应用实例-六度空间(题目描述、算法思路、伪代码及解读、图解)
84 0