拓扑排序JS实现

javascript:实现拓扑排序算法(附完整源码) 阅读详情

1 定义

在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,称为AOV网(Activity On Vertex Network)

设G={V,E}是一个具有n个顶点的有向图,V中的顶点序列v1、v2… 满足若从顶点vi到vj有一条路径,则在顶点序列中顶点vi必须在顶点vj之前,则称这样的顶点序列为一个拓扑序列

拓扑排序就是对一个有向图构造拓扑序列的过程,构造时会有两个结果,如果此网的全部顶点都被输出,则说明它是不存在环(回路)的AOV网;如果输出顶点数少了,说明这个网存在环(回路),不是AOV网。一个不存在回路的AOV网,可以应用在各种各样的工程或项目的流程图中,满足各种应用场景的需要。

对AOV网进行拓扑排序的基本思路是:

  1. 从AOV网中选择一个入度为0的顶点输出
  2. 然后删除此顶点及所有以此顶点为尾的弧
  3. 继续重复以上2个步骤,直到输出全部顶点或者AOV网中不存在入度为0的顶点为止

2 建立测试图

在这里插入图片描述
由于拓扑排序的过程需要删除节点,因此选择邻接表存储图更合适,且我们可以给邻接表中每个顶点增添一个入度域,方便查找入度为0的顶点。
在这里插入图片描述

class vex{
	constructor(value){
		this.data = value;
		this.firstEdge = null;
		this.in = 0;   //用于存放顶点的入度
	}

}

class adjvex{
	constructor(node,weight){
		this.node = node;
		this.weight = weight;
		this.next = null;
	}
}

class Graph{
	constructor(v,vr){
		let len = v.length;
		let vexs = new Array(len);
		let v1=0,v2=0;
		let newvex = null;
		for (let i=0;i<len;i++){
			vexs[i] = new vex(v[i]);
		}
		for (let arc of vr){
			v1 = v.indexOf(arc[0]);
			v2 = v.indexOf(arc[1]);

			newvex = new adjvex(v2,arc[2]);
			newvex.next = vexs[v1].firstEdge;
			vexs[v1].firstEdge = newvex;
			vexs[v2].in++;
		}
		this.adjList = vexs;
	}
}

let a = new Graph(['v0','v1','v2','v3','v4','v5','v6','v7','v8','v9','v10','v11','v12','v13'],[['v0','v11',1],['v0','v4',1],['v0','v5',1],['v1','v4',1],['v1','v8',1],['v1','v2',1],['v2','v5',1],['v2','v6',1],['v3','v2',1],['v3','v13',1],['v4','v7',1],['v5','v8',1],['v5','v12',1],['v6','v5',1],['v8','v7',1],['v9','v11',1],['v9','v10',1],['v10','v13',1],['v12','v9',1]]);
console.log(a);

在这里插入图片描述

3 拓扑排序算法

function topoSort(G){
	let stack = [];    //辅助栈
	for (let i=0;i<G.adjList.length;i++){   //寻找入度为0的顶点推入栈
		if (G.adjList[i].in === 0){
			stack.push(i);
		}
	}

	let currentVex = null;
	let count = 0;         //用于计数已经输出的顶点
	while(stack.length > 0){
		currentVex = G.adjList[stack.pop()];
		console.log(currentVex.data);      //输出栈顶顶点
		count++;
		currentVex = currentVex.firstEdge;
		while(currentVex){        //删除当前顶点,遍历其邻接顶点,使它们入度减1
			if ((--G.adjList[currentVex.node].in) === 0){  //当邻接顶点入度为0时
				stack.push(currentVex.node);    //将邻接顶点压入栈中
			}
			currentVex = currentVex.next;
		}
	}

	if (count < G.adjList.length){   //若输出的顶点数少于图中顶点数,则存在环
		console.log("存在环路");
		return false;
	}else{
		return true;
	}
}

在这里插入图片描述
第一次循环将入度为0的顶点入栈时间复杂度为O(n),在while循环中,扫描邻接顶点,时间复杂度为O(e),因此整体算法的时间复杂度为O(n+e)。

【JavaScript 算法】拓扑排序:有向无环图的应用 拓扑排序(Topological Sorting)是一种线性排序方法,适用于有向无环图(DAG, Directed Acyclic Graph),它能够为图中的节点安排一个线性序列,使得对于图中的每一条有向边(u, v),顶点u在序列中出现在顶点v之前。拓扑排序在许多实际应用中都有重要作用,如任务调度、课程安排、编译依赖等。本文将详细介绍拓扑排序的原理、实现及其应用。 阅读详情

相关推荐

JavaScript;实现topological sort拓扑排序算法(附完整源码)

JavaScript;实现topological sort拓扑排序算法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 381

JavaScript 拓扑排序 算法

拓扑排序会对有向图的所有顶点进行排序,使有向边从前面的顶点指向后面的顶点。拓扑排序算法与深度优先搜索类似。不同的是,拓扑排序算法不会立即输出已访问的顶点,而是访问当前顶点邻接表中的所有相邻顶点,直到这个列表穷尽时,才将当前顶点压入栈中。拓扑排序算法被拆分为两个函数。第一个函数 topSort(),会设置排序进程并调用一个辅助函数 topSortHelper(),然后显示排序好的顶点列表。主要工作是...

qq_29091239的博客 1361

拓扑排序算法实现(JavaScript)

拓扑排序是一种对有向无环图(DAG)进行排序的算法,它可以找到图中节点的一个线性顺序,使得对于图中的任意一对节点 u 和 v,如果存在一条从 u 到 v 的有向边,那么在排序中 u 出现在 v 之前。函数中,我们首先将当前节点标记为已访问,然后对当前节点的所有邻居节点进行递归调用。该函数接受一个有向图作为输入,并返回一个拓扑排序后的节点数组。数组来存储排序结果,通过在每次递归调用结束后将当前节点压入栈中,实现逆序排序。然后,我们遍历图中的每个节点,对每个未访问过的节点调用深度优先搜索函数。

CodeWhizZ的博客 184

拓扑排序原理分析及js实现

1. 偏序和全序的概念 1.1. 偏序 设R是集合A上的一个二元关系,若R满足下列三个性质则称R为A上的偏序关系自反性:对任意x∈A,有<x,x>∈R反对称性:对任意的x,y∈A,如果<x,y>∈R,且<y,x>∈R,则必有x=y传递性:对任意x,y,z∈A,若<x,y>∈R,<y,z...

weixin_33712987的博客 977

JavaScript实现topologicalSort拓扑排序算法(附完整源码)

JavaScript实现topologicalSort拓扑排序算法(附完整源码)Comparator.js完整源代码LinkedListNode.js完整源代码LinkedList.js完整源代码Stack.js完整源代码depthFirstSearch.js完整源代码topologicalSort.js完整源代码 Comparator.js完整源代码 export default class Comparator { constructor(compareFunction) { this.co

希望我的博客,能帮上你解决学习中工作中所遇到的问题 584

JavaScript:实现Topological Sort拓扑排序算法(附完整源码)

JavaScript:实现Topological Sort拓扑排序算法(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 579

JavaScript拓扑排序的实现

/** * 拓扑排序 * 凡是需要通过局部顺序来推到全局顺序的,使用拓扑排序来解决。 * 还可以使用拓扑排序来检测图中环的存在。 * * * 假设几个源文件之间两两之间的依赖关系已知,如何确定一个全局的编译的顺序呢? * 比如a依赖b,b依赖c,d依赖b * 那么编译顺序就是 c->b->a->d * 或者c->b->d->a * * * 我们使用一个有向无环图来实现拓扑排序。 * 文件之间的依赖关系抽象成一个有向图,每个源文件就是一个.

梁婉玲krysliang的博客 1267

js-topological-sorting:JavaScript的拓扑排序算法

:oden: JavaScript的拓扑排序算法。 参见 。 :warning: 该代码要求定义regeneratorRuntime ,例如,通过导入 。 // Sort anything that can be iterated over with `for (const [u, v] of ...)` import { sorted } from '@aureooms/js-topological-sorting' ; sorted ( [ "ab" , "bc" ] ) ; // abc // Add a comparison function to break ties. import { increasing } from '@aureooms/js-compare' ; sorted ( [ "ab" , "cd" ] , increasing ) ; // abcd import { dec

javascript实现拓扑排序

拓扑序: 如果,图中从v到w有一条有向路径,则v一定排在w之前,满足此条件的顶点序列称之为拓扑序,获得一个拓扑序的过程叫做拓扑排序;AVO如果有合理的拓扑序,则必定是有向无环图; // 拓扑排序 topSort: function(){ var that = this; var a = 1; var visit

景洪的博客 985

图(有向图)的拓扑排序

图的拓扑排序(有向图),用一个矩阵存储,环境为VC6.0

遥感卫星影像AI数据集格式规范详解、技术原理与数据生产全流程技术手册

本技术手册旨在系统性地梳理遥感卫星影像AI数据集的各类格式标准(涵盖VOC、COCO、YOLO及遥感专用DOTA格式等),深入剖析其背后的技术原理,并详细阐述数据生产的全过程,涵盖预处理、标注、质量控制及数据增强等关键环节。无论您是刚入门的算法工程师,还是资深的数据生产管理者,本手册都将为您提供详实的参考与指引。

panshengwu的博客 1128

43. 拓扑排序(javascript实现)

1. 定义 一种图论算法 只有有向无环图(Directed Acyclic Graph,简称DAG )才有拓扑排序 DAG必至少有一个入度为零的点和一个出度为零的点 2. 有向无环图实现 class LinkedList{ constructor(data){ this.data = data this.arr = [] } addPoint(val){ this.arr.p...

weixin_41837346的博客 494

植物叶绿体基因组分析全攻略:从共线性到密码子偏好性

本文全面解析植物叶绿体基因组分析流程,从共线性分析到密码子偏好性研究。详细介绍了叶绿体基因组结构特征、测序数据获取与质量控制、基因组组装与注释方法,以及比较基因组学和进化分析技术。特别关注IR区边界变异分析和选择压力评估,为植物系统发育研究和物种鉴定提供实用指南。

weixin_28475533的博客 222

从npm包依赖到任务调度:手把手用JavaScript实现Kahn拓扑排序,解决真实开发难题

本文详细介绍了如何使用JavaScript实现Kahn拓扑排序算法,解决npm包依赖解析和异步任务调度等真实开发难题。通过图论基础、算法实现到实战应用的完整讲解,帮助开发者掌握拓扑排序在解决依赖关系问题中的高效应用,特别适合处理复杂依赖和任务调度场景。

weixin_33704234的博客 379

iOS Certificates, Identifiers & Profiles简介

1. Certificates Certificates是生成开发和生产所需的证书。 2.1 certSigningRequest文件 生成证书前,需要先生成certSigningRequest文件,certSigningRequest文件由【钥匙串访问】生成。 选择菜单【钥匙串访问】,【证书助理】下的【从证书颁发机构请求证书…】 填写【用户电子邮件地址: 】,将【请求是:】的选项改为【储存到磁盘】 输入certSigningRequest文件的文件名,并指定保存位置。 保存certSignin

假装你是大灰狼的专栏 7058

华为设备OSPF配置全流程:从邻居关系到区域划分实战指南

本文详细介绍了华为设备上OSPF协议的完整配置流程,从基础概念到实战操作,包括邻居关系建立、多区域划分及高级特性配置。特别针对华为设备的特有语法和验证命令进行了重点讲解,帮助网络工程师快速掌握OSPF在华为环境中的部署与优化技巧,提升网络配置效率。

weixin_29299807的博客 251

从课程表到拓扑排序:JavaScript 实现有向无环图环检测

图论是计算机科学中描述依赖关系的核心工具,而拓扑排序则是处理有向无环图(DAG)的关键算法。在实际工程中,包管理器依赖解析、构建任务调度、编译顺序分析等场景都依赖这一基础模型。理解入度、邻接表和环检测的原理,能帮助开发者快速识别依赖冲突并设计可行的执行顺序。基于 BFS 的 Kahn 算法通过不断移除入度为 0 的节点来验证图是否存在循环,而 DFS 三色标记法则从递归路径中捕捉回路。两者时间复杂度均为 O(V+E),但 BFS 结构直观、便于扩展。本文以 LeetCode 207 课程表问题为例,详解 J

weixin_29309213的博客 84

基于Slim-Neck架构的YOLOv11轻量化特征融合方案(实现超轻量级与高精度的双重突破)

购买即可解锁800+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,每日更新。

m0_64661770的博客 250

LeetCode 207课程表:拓扑排序与环检测的JavaScript实现

在软件系统和现实工程中,依赖关系无处不在,例如课程先修、模块编译、包管理器安装等。这类场景都可以抽象为有向图,判断能否全部完成的关键在于是否存在循环依赖。拓扑排序与环检测是解决这类问题的核心算法,通过构建邻接表与入度数组,结合BFS或DFS即可高效判定。掌握这些基础图论技巧不仅有助于应对LeetCode等算法面试,更能提升对构建系统和任务调度的理解。本文以课程表问题为例,深入拆解建模思路、实现细节与性能优化,并给出JavaScript代码模板,帮助开发者快速上手这一高频考点。

weixin_42544461的博客 116

【SpringBoot 3.x 第92节】Spring Modulith:构建模块化单体架构(基于 Spring Boot 3),一文带你搞透(超详细)!

🏆本文收录于《滚雪球学SpringBoot 3.x》,专门攻坚指数提升,本年度国内最系统+最专业+最详细(永久更新)。    该专栏致力打造最硬核 SpringBoot3 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中…欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot3教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。

**My Coding Family** 999

Access查询中的Dlookup函数的妙用

在Microsoft Access中,处理和分析数据的过程中,常常会遇到需要根据条件从其他记录中提取特定数据的情况。这时候,Dlookup函数就成了开发者和数据分析师的得力助手。今天我们将通过一个具体的实例,详细探讨如何利用Dlookup函数来解决复杂的查询问题。

m0_62153576的博客 295

NodeJs语言实现拓扑排序(Topological Sorting)算法

NodeJs语言实现拓扑排序(Topological Sorting)算法在Node.js中,我们可以使用JavaScript来实现拓扑排序。可以使用Kahn算法和深度优先搜索(DFS)两种方法来实现。

zy0412326的专栏 343

32、社交媒体大数据中的情感分析与网络欺凌检测

本文探讨了社交媒体大数据在情感分析和网络欺凌检测中的应用。情感分析有助于应对自动化带来的社会变化、促进社会包容和推动环境保护。网络欺凌作为一种严重的在线危害,其检测依赖于数据预处理、特征提取与深度学习模型(如CNN、LSTM)进行分类。文章还总结了大数据在欺诈检测、医疗、制造、交通等领域的广泛应用,并分析了数据存储、处理速度、质量和技术工具等方面的挑战,提出了相应的应对策略。未来,随着技术进步,社交媒体大数据将在更多领域发挥关键作用。

cc789的博客 91

拓扑排序——JS+Echats实现

拓扑排序算法主要过程: 1.创建一个数组记录每个节点的前驱节点数目。 2.运用递归,每一次递归中,找出没有前驱节点的节点,输出该节点,并做相关标记(或删去);然后找到该节点引出的连接,做相关标记(或删去)。 3.递归终止条件:所有的节点都已经被标记(或被删去),或者找不到没有前驱节点的节点。 核心代码如下: sort = function(){ //找到没有前驱节点的节点 ...

hhthht8888的博客 541

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Camera2Demo

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

拓扑排序详解(JavaScript)(LeetCode 210.课程表II)

首先要比较熟悉图的基本概念,了解什么是入度、出度、环、有向图、邻接表,然后才能把这些内容应用于实践,在下面分两部分写一下。

hm342133194的博客 980

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: 最短路径-迪杰斯特拉(Dijkstra)和弗洛伊德(Floyd)算法JS实现
下一篇: 关键路径JS实现
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值