python 实现algorithm topo卡恩拓扑算法

ops/2024/10/9 13:07:41/

algorithm topo卡恩拓扑算法介绍

卡恩拓扑算法(也称为Kahn算法或Kahn’s Topological Sort Algorithm)是一种用于对有向无环图(DAG)进行拓扑排序的经典算法。拓扑排序是将有向无环图的节点按照依赖关系进行排序的过程,使得所有的依赖关系都得到满足。即,如果图中存在一条边u->v,则节点u在排序结果中一定出现在节点v之前。

卡恩拓扑算法的基本思想如下:

初始化:计算图中每个节点的入度(即有多少条边指向该节点)。同时,创建一个队列,并将所有入度为0的节点加入队列中。

处理队列中的节点:当队列非空时,从队列中取出一个节点,将其加入到拓扑排序的结果中。然后,遍历该节点的所有邻居节点,对每个邻居节点,将其入度减1。如果减1后某个邻居节点的入度变为0,则将其加入队列中。

重复上述步骤:重复步骤2,直到队列为空。

检查结果:如果最终拓扑排序的结果中包含了图中所有的节点,则说明图中没有环,拓扑排序成功;如果结果中节点数量少于图中的节点总数,则说明图中存在环,无法进行拓扑排序。

下面是使用Python实现卡恩拓扑算法的一个简单示例:

python">def kahnTopologicalSort(graph):from collections import deque# 计算每个节点的入度in_degree = {node: 0 for node in graph}for node in graph:for neighbor in graph[node]:in_degree[neighbor] += 1# 将所有入度为0的节点加入队列queue = deque([node for node in graph if in_degree[node] == 0])topo_sort = []# 当队列非空时继续处理while queue:node = queue.popleft()topo_sort.append(node)# 遍历当前节点的所有邻居节点for neighbor in graph[node]:in_degree[neighbor] -= 1if in_degree[neighbor] == 0:queue.append(neighbor)# 检查是否所有节点都被排序if len(topo_sort) == len(graph):return topo_sortelse:return None  # 图中存在环,无法进行拓扑排序# 示例图,使用字典表示,键为节点,值为该节点的邻居节点列表
graph = {'A': ['B', 'C'],'B': ['D'],'C': ['D'],'D': []
}# 调用函数进行拓扑排序
print(kahnTopologicalSort(graph))

请注意,上述代码中的图是用字典表示的,其中键是节点,值是该节点的邻居节点列表。你可以根据实际需求调整图的表示方式。

卡恩拓扑算法在任务调度、依赖关系管理、编译优化中的数据流分析等场景中有广泛的应用。

python_61">algorithm topo卡恩拓扑算法python实现样例

以下是Python实现卡恩拓扑算法的示例代码:

python">def topological_sort(graph):# 计算每个节点的入度in_degrees = {node: 0 for node in graph}for node in graph:for neighbor in graph[node]:in_degrees[neighbor] += 1# 将入度为0的节点加入队列queue = [node for node in graph if in_degrees[node] == 0]# 依次取出队列中的节点,并更新其邻居节点的入度result = []while queue:node = queue.pop(0)result.append(node)for neighbor in graph[node]:in_degrees[neighbor] -= 1if in_degrees[neighbor] == 0:queue.append(neighbor)# 检查是否存在环if len(result) != len(graph):raise ValueError("存在环路")return result

示例用法:

python">graph = {'A': ['B', 'C'],'B': ['C', 'D'],'C': ['D'],'D': []
}result = topological_sort(graph)
print(result)

输出:

['A', 'B', 'C', 'D']

这表示按照拓扑排序的顺序,首先访问节点A,然后是节点B,接着是节点C,最后是节点D。


http://www.ppmy.cn/ops/123193.html

相关文章

el-input 限制输入框只能输入数字和小数以及表单常用的校验规则

目录 1、纯输入框使用 2、form表单输入框使用 3、前端Vue中常用rules校验规则 1、纯输入框使用 方法一&#xff1a; oninput “valuevalue.replace(/[^\d]/g,‘’)” //只能输入数字 oninput “valuevalue.replace(/[^0-9.]/g,‘’)” //只能输入数字和小数 <el-inp…

报错 - llama-index pydantic error | arbitrary_types_allowed | PydanticUserError

国庆节前使用 LiteLLMEmbedding 设置 llama-index Settings.embed_model 还好好的&#xff0c;回来后&#xff0c;就就报错&#xff0c;试着降级 llama-index 也无用&#xff1b;设置 Settings.llm 也是好好地。 解决方法&#xff1a;conda 重新创建环境后&#xff0c;在安装 …

Hive数仓操作(十六)

DML&#xff08;数据操作语言&#xff09;指的是用于操作数据的 SQL 语言部分&#xff0c;主要包括对数据的插入、更新、删除等操作。Hive 的 DML语句主要包括 INSERT、UPDATE 和 DELETE 。以下是一些重要的 Hive DML 语句及其解析。 Hive的DML语句 一、 插入操作INSERT 一般…

过滤器Filter【详解】

过滤器Filter 1、 现有问题 在以往的Servlet中&#xff0c;有冗余的代码&#xff0c;多个Servlet都有重复的代码 比如编码格式设置 登录信息认证 2、 概念 过滤器&#xff08;Filter&#xff09;是处于客户端与服务器目标资源之间的一道过滤技术。 过滤器 3、 过滤器作用 执…

Databinding(kotlin)

简单使用&#xff08;只作为view获取&#xff09; build.gradle.kts配置 android {dataBinding {enable true}}activity注入 //setContentView(R.layout.activity_main) val binding: ActivityMainBinding DataBindingUtil.setContentView(this, R.layout.activity_main)x…

【预备理论知识——2】深度学习:线性代数概述

简单地说&#xff0c;机器学习就是做出预测。 线性代数 线性代数是数学的一个分支&#xff0c;主要研究向量空间、线性方程组、矩阵理论、线性变换、特征值和特征向量、内积空间等概念。它是现代数学的基础之一&#xff0c;并且在物理学、工程学、计算机科学、经济学等领域有着…

【HTTPS】深入解析 https

我的主页&#xff1a;2的n次方_ 1. 背景介绍 在使用 http 协议的时候是不安全的&#xff0c;可能会出现运营商劫持等安全问题&#xff0c;运营商通过劫持 http 流量&#xff0c;篡改返回的网页内容&#xff0c;例如广告业务&#xff0c;可能会通过 Referer 字段 来统计是…

b站-湖科大教书匠】4 网络层 - 计算机网络微课堂

【b站-湖科大教书匠】4 网络层 - 计算机网络微课堂_湖科大的计算机网络网课-CSDN博客