图的存储结构(JS实现)

数据结构-基于邻接矩阵实现图的遍历可视化及使用Floyd、Dijkstra算法求解最短路径(JavaScript实现) 使用 JavaScript 基于邻接矩阵实现了图的深度、广度遍历,以及 Floyd、Dijkstra 算法求解最短路径。另外使用 SVG 实现图的遍历可视化。一、输入首先,输入数据主要有两个,一个是存放节点名的数组,另一个是存放边对象的数组。例如://存放图结点的数组 var graphVertex = ["v0","v1","v2","v3","v4","v5","v6&amp 阅读详情

1 邻接矩阵

图的邻接矩阵存储方式是用两个数组来表示图,一个一维数组存储图中的顶点信息,一个二维数组存储图中的边或弧的信息。
在这里插入图片描述
在无向图中,二维矩阵是对称的,而在有向图中,则不是。若边上有权值,那么我们将矩阵值定义为:
在这里插入图片描述
在这里插入图片描述

//有向图的邻接矩阵存储方式
class Graph{
	constructor(v,vr){
		let len = v.length
		this.vexs = [].slice.apply(v);    //顶点数组
		let arcs = [];
		for (let i=0;i<len;i++){    //初始化矩阵
			arcs[i] = new Array(len);
			for (let j=0;j<len;j++){
				arcs[i][j] = i===j ? 0 : 65535;
			}
		}
		for (let arc of vr){ 
			let v1 = v.indexOf(arc[0]);
			let v2 = v.indexOf(arc[1]);
			arcs[v1][v2] = arc[2] || 1;   //若为无向表,则赋值arcs[v1][v2]
		}
		this.arcs = arcs;
	}

}

let a = new Graph([1,2,3,4],[[1,2,10],[3,4,100],[2,3,-16]]);
console.log(a);

在这里插入图片描述

2 邻接表

对于边数相对顶点较少的图,邻接矩阵会造成存储空间的极大浪费,因此我们考虑一种由数组与链表相结合的存储方式,即邻接表。邻接表由两部分组成,其中顶点由一个一维数组存储,每个顶点的所有邻接点用一个链表存储。其中firstedge域指向顶点的第一个邻接点,next域指向下一个邻接点。
在这里插入图片描述
在有向图中,很容易知道每个顶点的出度,但是对于入度,则需要遍历整个邻接表,因此还有一种逆邻接表,方便统计每个顶点的入度值。
在这里插入图片描述

//有向图的邻接表存储结构
class vex{          //存储顶点
	constructor(value){
		this.data = value;
		this.firstEdge = null;
	}

}

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);
		for (let i=0;i<len;i++){
			vexs[i] = new vex(v[i]);
		}
		for (let arc of vr){
			let v1 = v.indexOf(arc[0]);
			let v2 = v.indexOf(arc[1]);
			let adj = vexs[v1].firstEdge;
			if (!adj){    //尾插法
				vexs[v1].firstEdge = new adjvex(v2,arc[2]);   //若为无向表,还需考虑vexs[v2]
			}else{
				while(adj.next){
					if (adj.node === v2){     //若重复定义同一条边,则覆盖权值
						adj.weight = arc[2];
						break;
					}
					adj = adj.next;
				}
				if (adj.node !== v2)
				adj.next = new adjvex(v2,arc[2]);
			}
		}
		this.adjList = vexs;
	}
}

let a = new Graph([1,2,3,4],[[1,2,10],[3,4,100],[2,3,-16],[3,1,8]]);
console.log(a);

在这里插入图片描述

3 十字链表

在邻接表中,获取每个节点的入度较麻烦,而在逆邻接表中,获取每个节点的出度则较麻烦,那么我们综合两种表不就完美了?这就是十字链表。十字链表同样由两部分组成,其中顶点由一维数组存储,而边表则为链表。其中,firstin指向当前顶点入边表中第一条入边,firstout指向当前顶点入边表中第一条出边,tailvex为弧尾,taillink指向弧尾相同的边,headvex为弧头,headlink指向弧头相同的边。
在这里插入图片描述

class vex{
	constructor(value){
		this.data = value;
		this.firstIn = null;
		this.firstOut = null;
	}

}

class adjvex{
	constructor(tailvex,headvex,weight){
		this.tailvex = tailvex;
		this.headvex = headvex;
		this.weight = weight;
		this.taillink = null;
		this.headlink = null;
	}
}

class Graph{
	constructor(v,vr){
		let len = v.length;
		let vexs = new Array(len);
		let v1 = 0,v2 = 0;
		let adjout = null;
		let adjin = 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]);

			adjout = vexs[v1].firstOut;   //构造邻接表,尾插法
			if (!vexs[v1].firstOut){
				vexs[v1].firstOut = new adjvex(v1,v2,arc[2]);
				adjout = vexs[v1].firstOut;
			}else{
				while(adjout.taillink){
					adjout = adjout.taillink;
				}
				adjout.taillink = new adjvex(v1,v2,arc[2]);
				adjout = adjout.taillink;
			}

			adjin = vexs[v2].firstIn;   //构造逆邻接表,尾插法
			if (!vexs[v2].firstIn){
				vexs[v2].firstIn = adjout;
			}else{
				while(adjin.headlink){
					adjin = adjin.headlink;
				}
				adjin.headlink = adjout;
			}
		}
		this.xList = vexs;	
	}
}

let a = new Graph([1,2,3,4],[[1,2,10],[3,4,100],[2,3,-16],[3,1,8],[1,4,5],[4,3,9]]);
console.log(a);

在这里插入图片描述

4 邻接多重表

对于邻接表存储形式的无向图,若删除一条边,则需要对两个顶点进行操作,显得很麻烦。邻接多重表与十字链表结构相似,但是其在边表中每条边都由一个节点表示,该节点具有边弧的头尾顶点以及指向下一条依附于头尾顶点的边。其中firstedge指向依附于当前顶点的第一条边,ivex和jvex为边的两个顶点,ilink指向依附于ivex的边,jlink指向依附于jvex的边。
在这里插入图片描述

class vex{
	constructor(value){
		this.data = value;
		this.firstEdge = null;
	}
}

class adjvex{
	constructor(ivex,jvex,weight){
		this.ivex = ivex;
		this.jvex = jvex;
		this.ilink = null;
		this.jlink = null;
		this.weight = weight;
	}
}

class Graph{
	constructor(v,vr){
		let len = v.length;
		let vexs = new Array(len);
		let newvex = null;
		let v1=0,v2=0;
		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(v1,v2,arc[2]);
			newvex.ilink = vexs[v1].firstEdge;  //这里使用头插法,更简洁
			newvex.jlink = vexs[v2].firstEdge;
			vexs[v1].firstEdge = newvex;
			vexs[v2].firstEdge = newvex;
		}
		this.adjMultiList = vexs;
	}
}

let a = new Graph([1,2,3,4],[[1,2,10],[3,4,100],[2,3,-16],[3,1,8]]);
console.log(a);

在这里插入图片描述

JavaScript JS SHA256算法源代码JavaScript JS 实现原理 这是完全用JavaScript JS 编写的SHA256算法源代码 比特币 Bitcoin BTC 核心依赖算法SHA256源代码 /* * A JavaScript implementation of the SHA256 hash function. * * FILE: sha256.js * VERSION: 0.8 * AUTHOR: Christoph Bichlmeier <in... 阅读详情

相关推荐

JavaScript的起源?不同的JavaScript和引擎?JS版本发展史?

1995年,JavaScript诞生了。不得不提到它的标准ECMAScript, 它是一个语言标准,而非具体的语言。JavaScript除了名字有”Java”, 其它和Java没任何关系。Netscape为推广自家的LiveScript,命名中包含当时最流行的编程语言Java来蹭蹭热度。Netscape公司有些人可能不熟悉, 它就是早期被IE做浏览器对抗后来逐渐消亡一家公司。

编程语言开发、框架原理、编程思想、最佳实践技巧经验分享。致力于各种编程技术的技巧经验干货分享,讲解开发避坑技巧,追踪开发前沿技术,实战展开解决难题。 程序员小迷助您在编程路上越走越好! 2190

JavaScript数据结构与算法 -- 图

1.图的邻接矩阵表示法 邻接矩阵让每一个节点和一个证书相关联,该整数作为数组的下标值。 我们用一个二维数组来标识顶点之间的连接。 在二维数组中0表示没有连线,1表示有连线。 通过二维数组,我们很快的找到一个顶点和那些顶点有连线(比如A顶点,只需要遍历第一行就可) 另外A-A,B-B也就是顶点到自己的连线,通常使用0表示。 2.图的邻接表表示 邻接表由图中每个顶点以及和顶点相邻的顶点列表组成...

qq_43955202的博客 382

爬虫JS逆向实战:AES加密原理与JavaScript实现详解

AES(Advanced Encryption Standard)是一种广泛使用的对称加密算法,采用分组加密策略。在Web逆向工程中,AES常见于接口参数加密、敏感数据保护等场景。

weixin_65387849的博客 2097

JavaScript数据结构-7-3迪杰斯特拉-单源有向带权图-邻接矩阵

<!DOCTYPE html> <html> <head><meta charset="utf-8"> <title> 迪杰斯特拉算法求最短路径 </title> <script type="text/javascript" src="Dijkstra.js"></script> </h...

qq_34153210的博客 380

JavaScript_JS的历史与发展

JS的诞生:程序员的弃子 以下引用部分来源于: Javascript诞生记 - 阮一峰的网络日志 (ruanyifeng.com) JS的发明者是布兰登·艾奇(Brendan Eich)。他出生于1961年,本科一开始是念物理学的,后来转去了数学和计算机系。有趣的是,作为JS之父,他却并不喜欢自己的这个孩子。 90年代初的早期浏览器功能非常弱小,而且受众范围也不广。那时,浏览器最大的功能是展示一些图片和文字: 彼时,浏览器的王者是一个叫网景(Netscape)的公司开发的网景浏览器(Netscape N

Happievening的博客 2490

JavaScript实现邻接矩阵(附完整源码)

JavaScript实现邻接矩阵(附完整源码)

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

基于js实现图数据结构

图的相关概念 图是一组由边连接的节点的集合 任何二元关系都可以用图表示 相邻顶点:由一条边连接在一起的顶点 顶点的度:该顶点的相邻顶点数量 路径:顶点的连续序列,如A B C 简单路径:不包含重复的顶点 如果图中不存在环,则称该图是无环的 如果图中的每两个顶点间都存在路径,则该图是连通的 无向图,图的边没有方向,图的边有方向有向图 如果图中的每两个顶点在双向上都有路径,则该图是强连通的,反之就是稀疏图 加权图与未加权图,也就是路径是否有大小 图的表示方式 图的表示方式有很多种,不存在绝对正确的方式,各有

浪头的博客 557

深入掌握JavaScript Node.js开发

本文还有配套的精品资源,点击获取 简介:JavaScript是前端开发中的主导语言,在Node.js环境下的服务器端编程中也显示出重要性。Node.js是一个基于V8引擎的跨平台JavaScript运行环境,具有事件驱动和非阻塞I/O特性,适用于构建高性能的并发服务器。该压缩包文件可能包含有关Node.js核心概念和模块的资料,比如模块化设计、文件系统操作、HTTP服务器创...

weixin_28809949的博客 2110

深入JavaScript之JS引擎如何执行JS代码

我们大概经常能听到“执行环境”、“作用域”、“原型(链)”、“执行上下文”等内容,它们都在描述什么? JS代码的运行 我们知道了js是弱类型语言,在运行时才确定变量类型。js引擎在执行js代码时,也会从上到下进行 词法分析、语法分析、语义分析 等处理,并在代码解析完成后生成AST(抽象语法树),最终根据AST生成CPU可以执行的机器码并执行。 除此之外,JS引擎在执行代码时还会进行其它处理,如 V8 中还有两个阶段: 编译阶段:该阶段会进行执行上下文的创建,包括创建变量对象、建立作用域链、确定 this

flying meng的菜鸟居 5955

IDEA中Maven工具栏与命令执行全攻略:高效开发必备技巧

IntelliJ IDEA 作为强大的 Java 开发工具,其 Maven 功能独具优势。Maven 工具栏位于工作区右侧,图标功能丰富,涵盖项目导入、源码处理、依赖操作等。执行 Maven 命令有多种途径,Run Anything 窗口可输入或选目标执行,上下文菜单能右键运行目标,还可创建运行配置,指定命令参数后运行,为开发者高效管理 Maven 项目、便捷执行命令提供有力支持。

2301_82300081的博客 2030

ADS2020实战:村田电感.s2p与.mod文件导入全流程对比(附仿真结果差异分析)

本文详细对比了ADS2020中村田电感的.s2p与.mod文件导入流程及仿真结果差异,重点分析了两种模型在低频段和高频段的精度表现。通过实际案例展示.s2p文件在高频仿真中的优势,以及.mod文件在低频和非线性特性模拟中的准确性,为射频电路设计提供模型选择策略和混合仿真技巧。

weixin_29289821的博客 519

Node.js实现JavaScript后端化处理

通过Node.js搭建HTTP服务,实现前端JavaScript方法在后端执行,并支持参数传递与结果返回,结合PHP调用Node.js服务完成JS逻辑的后端化运行,提升动态处理能力。

weixin_29840475的博客 820

从QEvent到系统响应:EC如何成为硬件事件的隐形信使

本文深入解析嵌入式控制器(EC)如何作为硬件事件的隐形信使,通过QEvent机制将按键、合盖等物理事件转换为SCI信号,并经由ACPI架构触发操作系统响应。EC与BIOS紧密协作,实现了从底层硬件到系统层面的高效事件传递,是嵌入式开发和系统优化的关键技术。

yellow的专栏 651

three.js:一个基于JavaScript实现的3D建模库

Three.js 是一个让 Web 开发者能够以更简单、更高效的方式在浏览器中创建和展示 3D 内容的工具,适合产品 360° 展示,数据可视化,游戏开发,建筑与设计以及艺术和创意项目。

Tony.Dong的专栏 3599

实用电路精讲系列---双级运放放大电路(差分放大+跟随缓冲)

本文分析了双极运放放大电路的工作原理及其典型应用。该电路结合差分放大器和跟随缓冲器,实现高精度信号放大与阻抗匹配。差分放大器通过放大差模信号并抑制共模噪声提升信噪比;跟随缓冲器则提供阻抗变换,确保信号稳定传输。两者协同工作可优化输入阻抗、增强噪声抑制并提高设计灵活性。文章还列举了10个典型应用案例,包括医疗设备、工业传感器和新能源系统等,展示了该电路在精密电子系统中的关键作用。最后通过实用电路分析,详细说明了各模块功能及设计注意事项。

weixin_40590799的博客 2957

无人驾驶汽车系统入门(三十二)——FEC算法:点云快速欧几里得聚类实战解析

本文深入解析了FEC算法在无人驾驶点云聚类中的高效应用,通过逐点处理策略和体素栅格预分割技术,实现了比传统欧几里得聚类快百倍的速度。文章详细介绍了算法原理、Python实现及参数调优指南,并对比了FEC与传统算法的性能差异,为无人驾驶系统开发提供了实用解决方案。

weixin_29065015的博客 485

node.js和javascript的关系

node.js是一个基于 Chrome V8引擎的 JavaScript 运行时环境 一、类比JavaScript和java JavaScript java V8 JVM node.js JRE JavaScript和java都是一门编程语言,至于两者的关系,是雷锋和雷峰塔的关系 V8是google开源的JavaScript引擎,用于执行JavaScript,...

【小石头的茅坑】 71万+

Claude Code × SolidWorks:批量填属性、格式转换、BOM 汇总自动化实战

摘要:本文介绍利用 Claude Code 生成 VBA 宏实现 SolidWorks 批量处理任务的自动化方案。包含5个实战案例:批量填写自定义属性(60分钟任务→10秒)、批量格式转换(80分钟→30秒)、多配置工程图自动生成(120分钟→2分钟)、滚珠丝杠选型计算(15分钟→10秒)和装配体递归BOM导出(40分钟→1分钟)。所有代码基于SolidWorks 2020+ API,提供完整VBA实现和操作指南,可显著提升设计效率。

m0_64424835的博客 613

Vue.js与Velocity.js:结合JavaScript动画库实现流畅动画

🤍 前端开发工程师、技术日更博主、已过CET6🍨、23年度博客之星前端领域TOP1🕠高级专题作者、打造专栏🍚签约作者、上架课程。

你若盛开,清风自来 1486

古月学院《如何在Gazebo中实现阿克曼转向车的仿真》课程资料在ROS Noetic版本中运行时的常见错误及解决方法

   最近想在Gazebo中开发一些仿真内容,于是购买了古月学院的《如何在Gazebo中实现阿克曼转向车的仿真》课程,但是由于ROS 版本的更新,拿到手的课程资料不能直接在ROS Noetic版本中运行,经过我这几天的探索,对遇到的错误及解决方法进行了整理,方便后面购买课程的小伙伴更快的成功运行程序    在文章正式开始之前,先放一下我之前为了寻找该资料报错的原因,而写的两篇与该课程相关的文章链接,感兴趣的可以自行阅读    以阿克曼转向车为例对URDF和XACRO文件进行解读(点击可跳转)    将x

慕羽★的博客 5974

[网络安全自学篇] 八.Web漏洞及端口扫描之Nmap、ThreatScan和DirBuster原理详解

Web渗透技术的核心是发现Web漏洞,发现漏洞有手工和软件自动化扫描两种方式。对于用户验证漏洞、用户凭证管理问题、SQL注入等常见Web漏洞,都可以通过Web扫描器进行扫描。各个扫描器的功能和结果都不同,常见的包括HScan、HScan、X-Sccan、Acunetix Web Vulnerability Scanner、Jsky、Router Scan扫描工具等。本文主要讲解三个常见的Web漏洞扫描工具,分别是NMapp、ThreatScan和DirBuster。希望这篇基础性文章对你有所帮助.

杨秀璋的专栏 1万+

javaScript-如何引入js代码

javaScript-如何引入js代码 直接po代码和截图 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>js01-如何引入js代码</title> <script type="text/javascript"> //script标签的...

一只苟延残喘的卑微蝼蚁 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

imgwarp-js:用JavaScript实现图像变形

imgwarp-js:用JavaScript实现图像变形 项目介绍 imgwarp-js 是一个基于JavaScript的图像变形工具,它允许用户通过简单的代码实现图像的扭曲和变形效果。该项目最初由Drupal Ye移植自C++/OpenCV版本,并在此基础上进行了大量的优化和改进。通过imgwarp-js,开发者可以在网页中轻松实现图像的动态变形效果,为网页设计增添更多的创意和互动性。 项目技术...

gitblog_00445的博客 1273

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

NTscan扫描工具

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

Node.js和Javascript的异同

JavaScript的组成: ECMAScript(语言基础,如:语法、数据类型结构以及一些内置对象) DOM(一些操作页面元素的方法) BOM(一些操作浏览器的方法) Nodejs的组成: ECMAScript(语言基础,如:语法、数据类型结构以及一些内置对象) os(操作系统) file(文件系统) net(网络系统) ...

【小石头的茅坑】 71万+

javaScript+turn.js实现图书翻页效果

为了实现图书翻页的效果 我们在网上可以看到很多教程 在这里 推荐turn.js 网上的turn.js 有api 不过是英文的 很多人看起来不方便 关于代码也是奇形怪状 在这里 我将详细讲解 如何使用turn.js实现翻页效果 本篇文章只是讲解 turn.js 如何使用!!!!!!! 文章最后提供源码下载,结合源码看本文,turn.js更简单! ...

ZWH的博客 1万+

【JavaScript】JS对象和JSON

var perStr='{"属性名":"属性值","属性名":"属性值","属性名":{},"属性名":["","",""],"属性名":[{},{},{}]}'3、创建数组并初始化:new Array("one","two",2) ,可简写: var 数组名=[元素,...]9、数组.splice(start,deleteCount,[添加的元素,...])---删除或删除添加原数组元素。1、数组1.concat(数组2)---返回数组1和数组2合并后的新数组。

想做职场小白吗? 我来教您....... 3170
上一篇: 图的概念和定义
下一篇: JS实现图的深度优先遍历(DFS)和广度优先遍历(BFS)
PAT-python-zjw
博客等级 码龄10年 381粉丝 408原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值