【数据结构入门精讲 | 第十七篇】一文讲清图及各类图算法

Python基础(一)基本数据结构 在深入学习Python进阶知识前,先让我们一起探讨 Python 中一些基础数据结构+进阶数据结构,它们是我们在日常编程中经常使用的工具。 阅读详情

在上一篇中我们进行了的并查集相关练习,在这一篇中我们将学习图的知识点。

在这里插入图片描述

概念

下面介绍几种在对图操作时常用的算法。

深度优先DFS

深度优先搜索(DFS)是一种用于遍历或搜索树、图等数据结构的基本算法。该算法从给定的起点开始,沿着一条路径直到达到最深的节点,然后再回溯到上一个节点,继续探索下一条路径,直到遍历完所有节点或者找到目标节点为止。

具体步骤如下:

  1. 标记起始节点为已访问。

  2. 访问当前节点,并获取其所有邻居节点。

  3. 遍历所有邻居节点,如果该邻居节点未被访问过,则递归地对该邻居节点进行深度优先搜索。

  4. 重复步骤2和步骤3,直到所有能够到达的节点都被访问过。

DFS算法使用了递归或者栈的机制,在每一轮中尽可能深入地探索,并且只有在到达死胡同(无法继续深入)时才会回溯。DFS并不保证先访问距离起始节点近的节点,而是以深度为导向。

DFS算法可以用于寻找路径、生成拓扑排序、解决回溯问题等,但不保证找到最短路径。其时间复杂度为O(V+E),其中V表示节点数,E表示边数。在树或图的遍历中,DFS通常占用的空间较少,但在最坏情况下可能需要使用大量的栈空间。

简单来说,DFS遵循悬崖勒马回头是岸的原则

拿下图举例:从0一直完左走,走到3,发现没路可走后,回头,继续寻找。

在这里插入图片描述
所以:图的深度优先遍历类似于二叉树的先序遍历

伪代码

# 定义图的数据结构
graph = {
    'A': ['B', 'C'],
    'B': ['D', 'E'],
    'C': ['F'],
    'D': [],
    'E': ['F'],
    'F': []
}

# 定义访问状态数组
visited = {}

# 初始化访问状态
for node in graph:
    visited[node] = False

# 定义DFS函数
def dfs(node):
    # 标记当前节点为已访问
    visited[node] = True
    print(node, end=' ')

    # 遍历当前节点的邻接节点
    for neighbor in graph[node]:
        # 如果邻接节点未被访问,则递归调用DFS函数
        if not visited[neighbor]:
            dfs(neighbor)

# 从起始节点开始进行DFS
start_node = 'A'
dfs(start_node)


广度优先BFS

广度优先搜索(BFS)是一种用于遍历或搜索树、图等数据结构的基本算法。该算法从给定的起点开始,按照距离递增的顺序依次访问其所有邻居节点,并将这些邻居节点加入到一个队列中进行遍历,直到访问到目标节点或者遍历完所有节点。

具体步骤如下:

  1. 创建一个队列,将起始节点加入队列中并标记为已访问。

  2. 循环执行以下步骤,直到队列为空:

    • 弹出队列头部的节点。
    • 访问当前节点,并获取其所有邻居节点。
    • 遍历所有邻居节点,如果该邻居节点未被访问过,则将其加入队列尾部,并标记为已访问。
  3. 循环结束后,所有能够从起始节点到达的节点都已经被访问过了。

BFS算法可以用于寻找最短路径或者解决迷宫等问题,其时间复杂度为O(V+E),其中V表示节点数,E表示边数。相对于深度优先搜索,BFS搜索更具有层次性,能够保证先访问距离起始节点近的节点,因此在寻找最短路径时更为有效。

如何对一个图进行广度优先遍历呢?

方法是:每一层从左到右进行遍历

在这里插入图片描述
比如下图的结果就是1、2、3、5、6、4、7

在这里插入图片描述
所以图的广度优先遍历类似于树的层次遍历

伪代码

# 定义图的数据结构
graph = {
    'A': ['B', 'C'],
    'B': ['D', 'E'],
    'C': ['F'],
    'D': [],
    'E': ['F'],
    'F': []
}

# 定义访问状态数组
visited = {}

# 初始化访问状态
for node in graph:
    visited[node] = False

# 定义BFS函数
def bfs(start_node):
    # 创建队列并将起始节点入队
    queue = []
    queue.append(start_node)
    visited[start_node] = True

    while queue:
        # 取出队首节点
        current_node = queue.pop(0)
        print(current_node, end=' ')

        # 遍历当前节点的邻接节点
        for neighbor in graph[current_node]:
            # 如果邻接节点未被访问,则将其入队并标记为已访问
            if not visited[neighbor]:
                queue.append(neighbor)
                visited[neighbor] = True

# 从起始节点开始进行BFS
start_node = 'A'
bfs(start_node)

最短路径算法(Dijkstra)

Dijkstra算法是一种用于解决带权重图中单源最短路径问题的经典算法。它能够找到从起始节点到其他所有节点的最短路径。

该算法的基本思想是通过逐步扩展已知最短路径来逐步确定起始节点到其他节点的最短路径。它维护一个距离字典,记录从起始节点到每个节点的当前最短距离,并使用一个优先队列按照距离的大小进行节点的选择和访问。

具体步骤如下:

  1. 创建一个距离字典,并将所有节点的距离初始化为无穷大,将起始节点的距离设置为0。

  2. 将起始节点加入优先队列。

  3. 循环执行以下步骤,直到优先队列为空:

    • 从优先队列中取出距离最小的节点,作为当前节点。
    • 遍历当前节点的所有邻居节点:
      • 计算从起始节点到当前邻居节点的新距离,即当前节点的距离加上当前节点到邻居节点的边的权重。
      • 如果新距离小于邻居节点的当前距离,则更新邻居节点的距离为新距离,并将邻居节点加入优先队列。
  4. 循环结束后,距离字典中记录了从起始节点到所有其他节点的最短距离。

Dijkstra算法适用于有向图或无向图,但要求图中的边权重必须为非负值。它是一种贪心算法,在每一步都选择当前距离最小的节点进行扩展,直到到达目标节点或遍历完所有节点。该算法的时间复杂度为O((|V|+|E|)log|V|),其中|V|是节点数,|E|是边数。

伪代码

# 定义图的数据结构
graph = {
    'A': {'B': 5, 'C': 3},
    'B': {'A': 5, 'C': 1, 'D': 6},
    'C': {'A': 3, 'B': 1, 'D': 2},
    'D': {'B': 6, 'C': 2}
}

# 定义起始节点和终止节点
start_node = 'A'
end_node = 'D'

# 定义距离字典和前驱节点字典
distances = {}
predecessors = {}

# 初始化距离字典和前驱节点字典
for node in graph:
    distances[node] = float('inf')  # 将所有节点的距离初始化为无穷大
    predecessors[node] = None

# 设置起始节点的距离为0
distances[start_node] = 0

# 定义辅助函数:获取未访问节点中距离最小的节点
def get_min_distance_node(unvisited):
    min_distance = float('inf')
    min_node = None
    for node in unvisited:
        if distances[node] < min_distance:
            min_distance = distances[node]
            min_node = node
    return min_node

# Dijkstra算法主体
unvisited = set(graph.keys())
while unvisited:
    current_node = get_min_distance_node(unvisited)
    unvisited.remove(current_node)

    if current_node == end_node:
        break

    for neighbor, weight in graph[current_node].items():
        distance = distances[current_node] + weight
        if distance < distances[neighbor]:
            distances[neighbor] = distance
            predecessors[neighbor] = current_node

# 重构最短路径
path = []
current_node = end_node
while current_node != start_node:
    path.insert(0, current_node)
    current_node = predecessors[current_node]
path.insert(0, start_node)

# 输出结果
print("最短路径:", path)
print("最短距离:", distances[end_node])

Floyd算法

Floyd算法也称为插点法,是一种用于寻找图中所有节点对之间最短路径的算法,同时也可以用于检测图中是否存在负权回路。

Floyd算法采用动态规划的思想,通过不断更新两个节点之间经过其他节点的最短距离来求解任意两个节点之间的最短路径。具体而言,算法维护一个二维数组 dp,其中 dp[i][j] 表示从节点 i 到节点 j 的最短路径长度。初始化时,若存在一条边从节点 i 到节点 j,则 dp[i][j] 的初值为这条边的边权;否则,dp[i][j] 被赋值为一个足够大的数,表示节点 i 无法到达节点 j。

接下来,我们通过枚举一个中间节点 k,来更新所有节点对之间的最短路径长度。具体而言,如果 dp[i][j] > dp[i][k] + dp[k][j],则说明从节点 i 到节点 j 经过节点 k 的路径比当前的最短路径还要短,此时可以更新 dp[i][j] 的值为 dp[i][k] + dp[k][j]。

重复执行上述步骤,直到枚举完所有的中间节点 k,即可得到任意两个节点之间的最短路径长度。如果在更新过程中发现某些节点之间存在负权回路,则说明无法求解最短路径。

#define INF 99999
#define V 4

void floydWarshall(int graph[V][V]) {
  int dist[V][V], i, j, k;
  
  // 初始化最短路径矩阵为图中的边权值
  for (i = 0; i < V; i++)
    for (j = 0; j < V; j++)
      dist[i][j] = graph[i][j];
  
  // 动态规划计算最短路径
  for (k = 0; k < V; k++) {
    for (i = 0; i < V; i++) {
      for (j = 0; j < V; j++) {
        // 如果经过顶点k的路径比直接路径更短,则更新最短路径
        if (dist[i][k] + dist[k][j] < dist[i][j])
          dist[i][j] = dist[i][k] + dist[k][j];
      }
    }
  }
  
  // 打印最终的最短路径矩阵
  for (i = 0; i < V; i++) {
    for (j = 0; j < V; j++) {
      // 如果路径为无穷大,则打印INF;否则打印最短路径值
      if (dist[i][j] == INF)
        printf("%7s", "INF");
      else
        printf("%7d", dist[i][j]);
    }
    printf("\n");
  }
}

拓扑排序

拓扑排序和逆拓扑排序都是用于对有向无环图进行排序的算法。

拓扑排序:对于一个有向无环图,拓扑排序可以得到一组节点的线性序列,使得对于任何一个有向边 (u, v),在序列中节点 u 都排在节点 v 的前面。以下是拓扑排序的伪代码:

# 定义图的数据结构
graph = {
    'A': ['B', 'C'],
    'B': ['D', 'E'],
    'C': ['F'],
    'D': [],
    'E': ['F'],
    'F': []
}

# 定义入度字典
in_degree = {}

# 初始化入度字典
for node in graph:
    in_degree[node] = 0

for node in graph:
    for neighbor in graph[node]:
        in_degree[neighbor] += 1

# 定义队列并将入度为0的节点加入队列
queue = []
for node in in_degree:
    if in_degree[node] == 0:
        queue.append(node)

# 进行拓扑排序
result = []
while queue:
    current_node = queue.pop(0)
    result.append(current_node)

    for neighbor in graph[current_node]:
        in_degree[neighbor] -= 1
        if in_degree[neighbor] == 0:
            queue.append(neighbor)

# 输出结果
print(result)

逆拓扑排序

逆拓扑排序:与拓扑排序相反,逆拓扑排序可以得到一组节点的线性序列,使得对于任何一个有向边 (u, v),在序列中节点 v 都排在节点 u 的前面。以下是逆拓扑排序的伪代码:

# 定义图的数据结构
graph = {
    'A': ['B', 'C'],
    'B': ['D', 'E'],
    'C': ['F'],
    'D': [],
    'E': ['F'],
    'F': []
}

# 定义出度字典
out_degree = {}

# 初始化出度字典
for node in graph:
    out_degree[node] = len(graph[node])

# 定义队列并将出度为0的节点加入队列
queue = []
for node in out_degree:
    if out_degree[node] == 0:
        queue.append(node)

# 进行逆拓扑排序
result = []
while queue:
    current_node = queue.pop(0)
    result.append(current_node)

    for neighbor in graph[current_node]:
        out_degree[neighbor] -= 1
        if out_degree[neighbor] == 0:
            queue.append(neighbor)

# 输出结果
print(result)
小曾WRF自学日记(3)渐入佳境 ——WRF实例-数据下载与WPS前处理 ww 阅读详情

相关推荐

RS485两线制接线实战:从差分信号原理到Modbus避坑指南

本文深入解析RS485两线制接线的核心原理与实战步骤。从差分信号的抗干扰机制出发,详细拆解总线规划、屏蔽层接地、终端电阻安装等关键实操细节,并针对Modbus应用中常见的信号反射、极性接反、共模干扰等问题提供系统化的排查指南与解决方案,助力工程师构建稳定可靠的工业通讯网络。

7up55的博客 734

408数据结构一图流:核心考点、易混点与高效复习方法

数据结构是408计算机考研中的核心基础课,也是算法与工程实践的底层能力。面对线性表、树、图、查找与排序等庞杂考点,考生常被排序稳定性、AVL旋转、KMP匹配和复杂度推导困扰。掌握数据结构不能靠死记,而应从存储结构、时间复杂度和典型应用场景出发,建立一张带优先级、易混标注的知识图谱。一图流将散落考点压缩成可索引的结构化复习框架,再结合真题回填与代码骨架训练,既能快速定位薄弱点,也能提升算法设计题的实战能力。这种复习方式不仅适用于考研冲刺,也适合算法面试前的知识体系梳理。

weixin_30512043的博客 619

【FDTD运行引擎错误解决方法】

我用的是2024R1版的FDTD,第一次安装好的时候点“RUN”可以正常运行,后来不知道什么问题就无法运行了。我从网上找相关的解决办法,并未找到,将软件卸载重装,重启等方法都没有解决,后来在官网按照提示解决了,我把官网提供的方式和我的情况相结合,提供一个解决方式。提示:以下是本篇文章正文内容,下面案例可供参考最后说一下两个MPI和Local computer(不使用MPI)的区别使用MPI进行仿真可以显著提高计算速度和效率,特别是对于大规模和复杂的仿真任务,但需要额外的设置和配置。(多线程并行计算)

m0_57410975的博客 8171

无涯教程-Python - 图(Graphs)

图(Graphs)是一组对象的图形表示,其中一些对象通过链接连接,互连的对象由称为顶点的点表示,而连接这些顶点的链接称为边。在本章中,无涯教程将了解如何使用python程序创建图形并向其中添加各种数据元素。使用python字典数据类型可以很容易地显示图形,将顶点表示为字典的键,并将顶点之间的连接也称为边作为字典中的值。在上图中V={abcdeE={abacbdcdde可以在python程序中显示此图,如下所示。# 使用图形元素创建字典graph={"a"

无涯教程 1293

数学建模国赛C题实战:从数据预处理到模型优化的完整流程(附Python代码)

本文系统讲解了数学建模国赛C题的完整实战流程,涵盖从数据预处理、模型选择与构建到优化与结果可视化的关键步骤。文章重点分享了如何利用Python进行高效的数据清洗、特征工程,并提供了多种机器学习模型的实现代码与对比验证方法,旨在帮助参赛者构建逻辑清晰、结果可靠的解决方案。

weixin_29079643的博客 293

AD服务器搭建

一、角色安装1)打开服务器管理器,添加 角色和功能;2) 点 下一步;3)点 下一步;4)点 下一步;5)点击安装;6-1)将此服务器提升为域控制器;6-2)点下一步;6)输入密码 点 下一步;7)自动生成LIXF,点击下一步;8)确认目录,点下一步;8)确认安装条件,点安装; 8)安装成功,点关闭;...

潇峰的博客 6451

杂谈——图的基本概念

文章目录前言一、图与数据结构二、图的种类1.无向图、有向图2.完全图结语 前言     这是一个开始,希望可以延续下去。想着每天把学到的东西总结一下放在这里。可能有时候去玩耍之类的就鸽了,也有可能觉得内容不适合放在这里就鸽了,也有可能是三分钟热度的褪去。但是,只要我还在这瞎bb,就会好好写,把知识感受写下来。要是有幸有某位看官大人看到,能为您提供帮助是最好的,希望指正批评。 今天学习了数据结构中的图,还停留在基本概念上,就写写我关于这些概念的感悟吧。 一、图与数据结构     这里的图指的是什么?.

gapb334的博客 373

(五)深入理解Bluez协议栈之“GATT Server Profile”

上一篇介绍Bluez协议栈的了GAP Profile的实现,本章节我们继续介绍GATT Profile的实现,参考的程序是Peripheral。通过阅读它的实现代码可以发现,它广播部分是通过mgmt来实现的,然后在初始化完成之后,创建了一个L2CAP类型的socket,来负责实现GATT Server的逻辑。

1142

python编程图_Python - 图形

图表是一组对象通过链接连接的一组对象的图形表示。互连对象由称为顶点的点表示,连接顶点的链接称为边。我们的教程在这里详细描述了与图形相关的各种术语和功能。在本章中,我们将看到如何使用python程序创建图形并向其添加各种数据元素。以下是我们在图表上执行的基本操作。显示图形顶点显示图形边缘添加一个顶点添加边缘创建一个图可以使用python字典数据类型轻松呈现图形。我们将顶点表示为字典的关键字,顶点之间...

weixin_39627390的博客 325

迟滞电压比较器电路的原理与计算

迟滞电压比较器是一种具有双阈值特性的电路,通过正反馈机制实现抗噪声干扰功能。文章详细分析了其工作原理,包括同相型和反相型两种结构的电压阈值计算与电阻设计方法,并提供了已知门限求电阻和已知电阻求门限的推导公式。工程应用中需注意输出类型匹配、电阻取值范围、噪声裕量设计等问题。该比较器在信号处理、波形转换等场景中具有重要应用价值,设计时需综合考虑供电电压、参考电压和噪声特性等因素。

硬核科技 2681

YOLO由浅入深,最简单地说明白YOLO基本实现原理

YOLO(You Only Look Once)是一种高效的实时目标检测技术,广泛应用于自动驾驶、监控和无人机等领域。其核心优势在于速度快,能够在视频流中实时识别目标并标出其位置、大小、类别及置信度。YOLO基于卷积神经网络(CNN),通过卷积层提取图像特征,池化层和扁平化层优化特征处理,全连接层进行分类。与传统方法不同,YOLO将图像分割成多个网格,每个网格预测多个边界框及其置信度,仅对高置信度的框进行详细计算,从而快速确定目标的位置和类别。这种机制使得YOLO在保持高准确率的同时,实现了高效的实时处理能

qq_30279827的博客 566

数据结构:图及相关算法讲解

图及相关算法讲解

2301_76269963的博客 1860

液滴碰撞壁面的过程背景论文——bouncing反弹,spreading扩展,splashing飞溅。铺展过程介绍。还存在很多未解之谜。

【1993-德国-Phenomena of liquid drop impact on solid and liquid surfaces】液滴碰撞壁面的过程背景——bouncing反弹,spreading扩展,splashing飞溅。还存在很多未解之谜。还存在很多未解之谜。不同液滴形状碰撞过程。

qq_15963745的博客 199

【数据结构】一篇讲清楚什么是堆? 带图食用超详细~

【数据结构】一篇讲清楚什么是堆? 带图食用超详细~

weixin_71246590的博客 1184

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

数据结构与算法:终于可以用三种语言(C,C#,JavaScript)把图的广度优先遍历讲清楚了(推荐收藏)

文章目录邻接矩阵存储图的广度优先遍历过程分析C语言实现队列编程程序中加入图的处理函数结果的再次分析C#语言实现图的广度优先遍历、并显示广度优先遍历生成树JavaScript语言实现图的广度优先遍历、并显示广度优先遍历生成树 邻接矩阵存储图的广度优先遍历过程分析 对图1这样的无向图,要写成邻接矩阵,则就是下面的式子 一般要计算这样的问题,画成表格来处理是相当方便的事情,实际中计算机处理问题,也根本不知道所谓矩阵是什么,所以画成表格很容易帮助我们完成后面的编程任务。在我们前面介绍的内容中,有不少是借助着表格完

智慧空间实验室 5480

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

数据结构与算法 - 图的遍历标记:避免重复访问的两种方式

本文介绍了图遍历中避免重复访问节点的两种标记方法:访问标记法和三色标记法。访问标记法通过布尔数组或集合记录访问状态,简单高效,适用于基础遍历场景;三色标记法则细分为未访问、处理中和已完成三种状态,可检测环路并支持拓扑排序等高级算法。文章通过Java代码示例和状态转换图详细对比了两种方法的实现原理、优缺点及适用场景,为图算法实践提供了系统指导。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

GESP七级图论题精讲:从线图概念到C++邻接表算法实现

图论是计算机科学中研究图结构及其性质的基础领域,邻接表则是存储稀疏图最常用的高效数据结构。其核心原理是通过链表或动态数组记录每个顶点的相邻顶点,从而在空间和时间上取得平衡。掌握图论模型与数据结构选型,对于解决网络分析、路径规划等工程问题具有重要价值。本文以GESP认证考试中的典型题目为切入点,深入解析如何将抽象的“线图”概念转化为具体的C++工程实现。通过剖析线图构建中边编号映射、邻接关系判断等关键步骤,并结合vector、set等STL容器的实战应用,展示了从问题定义到代码落地的完整思维流程,为算法学习与

weixin_33713503的博客 430

interviews:6.5 万人 Star 的面试刷题指南

GitHub上拥有6.5万星的kdn251/interviews项目是一个全面的面试刷题指南,整合了数据结构、算法理论和Java实现代码。该仓库系统性地讲解了链表、栈、队列等高频数据结构,并覆盖排序、图算法等核心算法,配有动态演示图辅助理解。提供124个分类Java题解,对应LeetCode高频题目。此外还推荐了在线刷题平台、公开课和经典书籍资源。尽管最后更新于2018年,但其基础知识仍具时效性,适合准备技术面试的开发者用于系统复习和代码参考,有效衔接理论知识与编程实践。

jinggangdev650的博客 252

数据结构与算法 - 大规模图处理:分治与采样的优化思路

摘要 本文探讨了大规模图数据处理中的两种优化策略:分治法与采样技术。分治法通过"分解-解决-合并"的流程将大图拆分为子图分别处理,适用于最短路径查询等场景;采样技术则通过选取代表性样本来估算全局特征,如中心度测量。两种方法各具优势:分治法可并行化但依赖划分质量,采样速度快但存在精度损失。实际应用中常需结合使用,如在推荐系统中先采样再分区处理。文章通过代码示例和案例分析,为处理海量图数据提供了实用优化思路。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

PHP面试逆袭指南:如何用PHP-Data-Structure-and-Algorithms系统刷透数据结构与算法面试题

> PHP 开发者被"问到算法就懵"?开源项目 **PHP-Data-Structure-and-Algorithms** 用纯 PHP 实现了 10 大类、40+ 个数据结构与算法,从链表、栈、队列到图算法、动态规划,全部配可运行的示例代码。跟着它的目录结构刷一遍,数据结构与算法面试题不再难。 ## 🎯 为什么PHP开发者必须啃下数据结构与算法? 面试中,"手写链表反转""二叉树遍历""0

gitblog_01092的博客 263

非科班出身者借助AI攻克高难度算法题的完整学习路径

摘要: 本文为非科班出身的学习者提供了一条借助AI攻克高难度算法题的完整路径。通过四个阶段:构建基础(数据结构与基础算法)、进阶学习(动态规划等高级主题)、实战应用(项目与竞赛)以及持续优化(目标管理与社区互动),AI工具全程辅助,提供个性化解释、题目解析、代码优化及模拟面试。研究表明,AI辅助可提升40%学习效率。文章包含代码示例、学习流程图及资源推荐,帮助学习者高效掌握算法思维,实现从入门到精通的跨越。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

数据结构与算法 - 任务调度:拓扑排序处理依赖任务

本文介绍了拓扑排序的原理及其在任务调度中的应用。拓扑排序针对有向无环图(DAG)进行线性排序,确保每个任务都在其依赖任务之后执行。文章通过"番茄炒蛋"的生动例子说明任务依赖关系,并详细讲解两种经典算法:基于入度的Kahn算法和基于DFS的后序遍历算法。两种方法都能检测循环依赖并报错。拓扑排序广泛应用于项目管理、编译系统、微服务启动等场景,是工作流引擎的核心调度算法之一。文章提供了Python实现代码和可视化图表,帮助读者深入理解这一重要算法。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

数据结构与算法 - 优先队列的底层原理:堆结构如何支撑优先级排序

数据结构与算法:优先队列与堆结构解析 🧠 本文深入探讨优先队列的核心实现原理——堆结构。优先队列是一种按优先级处理元素的抽象数据类型,广泛应用于任务调度、图算法等场景。与普通队列不同,其操作时间复杂度需满足: 插入(offer): O(log n) 删除最高优先级元素(poll): O(log n) 查看最高优先级元素(peek): O(1) 堆作为完全二叉树,通过数组紧凑存储,利用父子节点索引公式实现高效访问。关键操作包括: 上滤(siftUp):插入时从底部向上调整 下滤(siftDown):删除时从

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

SmolVLA代码生成能力极限测试:复杂算法与数据结构实现

本文介绍了如何在星图GPU平台上自动化部署SmolVLA镜像,以测试其生成复杂算法与数据结构代码的能力。通过该平台,开发者可快速搭建环境,验证SmolVLA在动态规划、图论算法及自定义数据结构(如LRU缓存)等场景下的代码生成效果,提升编程与算法验证效率。

weixin_35757191的博客 45

邻接表数据结构详解:从原理到C语言实现与遍历算法

图是数据结构中用于表示多对多关系的重要模型,其核心在于如何高效存储顶点与边的关系。邻接矩阵虽然直观,但其O(V²)的空间复杂度在处理社交网络、网页链接等稀疏图时会造成巨大浪费。邻接表通过为每个顶点维护一个边链表,将空间复杂度优化至O(V+E),实现了空间与时间的有效权衡,尤其适合工程中常见的大规模稀疏图场景。其技术价值在于,它是深度优先搜索(DFS)和广度优先搜索(BFS)等图遍历算法,乃至最短路径、最小生成树等高级算法的存储基石。理解邻接表中顶点表与边链表的协同设计、掌握有向图与无向图的实现差异,并能熟练

weixin_34122810的博客 329

数据结构与算法 - BFS在实时计算中的应用:流式数据的层次处理

本文探讨了广度优先搜索(BFS)在实时流式计算中的应用价值与实现方法。文章首先对比了批处理与流处理的特性差异,指出BFS"队列驱动、层次扩展、最短路径保证"等特性与流式计算需求高度契合。通过架构设计分析,提出了包含事件源、图状态存储、BFS算子和结果汇的系统实现方案。最后以金融交易异常检测为例,展示了基于Flink的流式BFS代码实现,说明如何实时检测环形交易路径。全文强调将流式数据视为动态图,利用BFS模拟信息扩散过程,为实时智能应用提供新的解决思路。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+
上一篇: 【数据结构入门精讲 | 第十六篇】并查集知识点及考研408、企业面试练习
下一篇: 【数据结构入门精讲 | 第十九篇】考研408、企业面试图专项练习(二)
秋说
秋说 优质创作者: 编程框架、信息安全技术领域 优质创作者: 编程框架、信息安全技术领域
博客等级 码龄4年 3万+粉丝 1906原创
评论 21
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值