javascript实现图的广度优先搜索、深度优先搜素

js实现深度优先搜索(DFS)和广度优先搜索(BFS) 深度优先搜索(DFS) 首先构造一个我们需要遍历的结构,这里用html演示 <div id="root"> <p></p> <label></label> <ul> <li> <span></span> </li> <li></li> 阅读详情

用邻接表表示图:

如下图所示的图:
这里写图片描述
用邻接表二维数组表示为:

adj[0] = [1,2,5,6];
adj[1] = [0,3,8,9];
adj[2] = [0,4];
adj[3] = [1];
adj[4] = [2];
adj[5] = [0,7];
adj[6] = [0];
adj[7] = [5];
adj[8] = [1];
adj[9] = [1]



构建图类:

    function Graph(v){
                this.vertices = v;//顶点数
                this.edges = 0;//边数
                this.adj = [];//数组this.adj用来存放每个每个顶点的临接表
                this.visited = [];//深度度优先搜索的是否访问标志
                this.visited_2 = [];// 广度优先搜索的是否访问标志
                for (var i = 0; i < this.vertices; i++){
                    this.adj[i] = [];
                    this.visited.push(false);
                    this.visited_2.push(false);
                }
            }
    Graph.prototype = {
      //存放方法
    }



添加边

addEdge: function(a, b){
            // a、b为节点
            this.adj[a].push(b);
            this.adj[b].push(a);
            this.edges ++;//把总边数增加1
        }



显示整个表

    showGraph: function(){
            for (var i = 0; i < this.vertices; i ++){
                console.log(i + '=>');
                for (var j = 0; j < this.vertices; j ++){
                    if (this.adj[i][j]){
                      console.log(this.adj[i][j]);
                    }
                }
            }
        }



深度优先搜索

利用递归的思想,访问一个没有访问过的顶点,将它标记为已经访问,再递归的去访问在初始顶点的邻接表中的其他没有访问的节点;

// 深度优先搜索
dfs: function(vertice){
     this.visited[vertice] = true;
     console.log(vertice);
     for (var i = 0; i < this.adj[vertice].length; i++){
       var curVertice = this.adj[vertice][i];
       if (!this.visited[curVertice]){
            this.dfs(curVertice);
       }
      }
}



广度优先搜索

广度优先搜索从第一个顶点开始,尝试访问尽可能靠近它的节点,有点类似树的层序遍历;

    //广度优先搜索
        bfs: function(vertice){
            var that = this;
            var queue = [];
            queue.push(vertice);
            this.visited_2[vertice] = true;
            // 当队列不为空时,循环进行;
            while (queue.length > 0){
              var curVertice = queue.shift();
              console.log(curVertice);
              this.adj[curVertice].forEach(function(item){
                    if (!that.visited_2[item]){
                        that.visited_2[item] = true;
                        queue.push(item);
                    }
              })
            }
        }



实例化图,并使用深度优先搜索、广度优先搜索

创建树,新建边

  var graph = new Graph(10);
          graph.addEdge(0, 1);
          graph.addEdge(0, 2);
          graph.addEdge(0, 5);
          graph.addEdge(0, 6);
          graph.addEdge(1, 3);
          graph.addEdge(1, 8);
          graph.addEdge(1, 9);
          graph.addEdge(2, 4);
          graph.addEdge(5, 7);

显示图的结构:(邻接表):

 graph.showGraph();

这里写图片描述



深度优先搜索:

 graph.dfs(0);

这里写图片描述


广度优先搜索

 graph.bfs(0);

这里写图片描述



寻找两点间的最短路径

首先在原型对象中写入一个allDistance函数,出入一个节点为参数,返回这个节点到其他所有节点的无权距离,用数组表示;

//无权图的单源最短路径的算法
        allDistance: function(vertice){
            var distance = [];
            // 初始化distance数组,用来存放所有的距离
            for (var i = 0; i < this.vertices; i++){
                distance.push(-1);
            }
            var that = this;
            var queue = [];
            queue.push(vertice);
            distance[vertice] = 0;
            // 当队列不为空时,循环进行;
            while (queue.length > 0){
              //从队列中弹出一个节点
              var curVertice = queue.shift();
              //遍历与当前节点相邻的所有节点
              this.adj[curVertice].forEach(function(item){
                    // 如果item没有被访问过
                    if (distance[item] < 0){
                        distance[item] = distance[curVertice] + 1;
                        queue.push(item);
                    }
              })
            }
            return distance;
        }


然后定义一个minDistance函数:返回从v点到w点的距离:

minDistance: function(v, w){
          //先求出v到所有节点的距离    
          var distance = this.allDistance(v);
          return distance[w];
        }


验证一下:
在前面那个图实例中,

console.log(graph.minDistance(3,7));//4
console.log(graph.minDistance(1,2));//2
【JavaScript 算法】图的遍历:理解图的结构 图的遍历是图论中的基本操作之一,通过遍历图中的所有节点和边,可以理解图的结构并解决实际问题。常见的图遍历方法有深度优先搜索(DFS)和广度优先搜索(BFS)。本文将详细介绍这两种遍历方法的原理、实现及其应用。 阅读详情

相关推荐

数学之美 | 图论和网络爬虫

文章目录概述图论网络爬虫分析BFSDFSBFS + DFS参考资料 概述 这篇文章主要给大家介绍一下计算机算法中非常重要的一部分——图论,以及它在生活中的应用——网络爬虫。   图论 离散数学是当代数学的一个重要的分支,也是计算机科学的数学基础。它又包括四个分支,而图论便是其中一支,另外三个分别是:数理逻辑、集合论、近代数学。 图论中的图由一些节点和边构成,比如下面这张图 。 在图论中一个很基础...

小小酥梨的博客 3231

js实现树的深度优先搜索、广度优先搜索

树的深度优先搜索以及广度优先搜索 示例数据 tree = { value:"A", children:[ { value:"B", children:[ { value:"D", children:[] }, {

helloworldbey的博客 1178

实现单芯片2400bps 音频编解码方案

终于按照朋友的需求,帮他开发了一款单芯片集音频采集编码传送并接收解码播放功能的方案,交给快递公司邮寄给远在郑州的他.整个项目从开始定型到现在一个样机送出,整整花了1个月时间,感觉挺有成就感,挺有意思,工作是辛苦的,结果却是快乐的.现在将这中快乐的的心情与大家分享一下.    真个项目用一颗主控搞定,ARM9的,200KBytes 片内RAM,主频可以跑到300MHz,64pin LQFP封装

nyxsec的专栏 3684

简单深搜广搜基本模板

简单搜索 DFS: 剪枝,条件 容易超时,超时后基本就是剪枝的问题/无限递归?,或者用广搜试试? 模板(自己的理解) int n,m;//一般输入的行列数/边界 int mov[4][2] = {1,0,-1,0,0,1,0,-1}; int vis[N][N],mapp[N][N];//vis初始化应该在主函数 int s = 0;//记录步数时间什么的 void DFS(int x,int y) { if(x = endx && y == endy)//满足条件

MC的博客 2968

使用LogisticRegression和LightGBM模型对信贷违约进行预测----基于kaggle比赛数据

3.分离数值型变量与类别型变量,发现有些数值型变量因为输入不规范,比如数值中含有字符(28_,_10000_等)被划分为类别型变量 ,比如 'Age','Annual_Income','Num_of_Loan', 'Num_of_Delayed_Payment', 'Changed_Credit_Limit','Credit_Mix','Monthly_Balance', 'Outstanding_Debt' ,'Amount_invested_monthly'等。三、分箱,woe编码,计算IV值。

I_am_a_big_tiger的博客 1682

基于FPGA的TDC延迟链优化与码密度校准方法(1)——原理与实现

本文深入探讨了基于FPGA的时间数字转换器(TDC)延迟链非均匀性问题及其码密度校准方法。通过分析工艺偏差、温度电压影响等根源,详细介绍了码密度测试原理、逐位校准技术及气泡消除算法,并分享了自适应校准策略与多场景应用实践,有效提升TDC测量精度至皮秒级。

kiwi8的博客 488

图的搜索算法javascript

搜索就是从一个指定的点开始找到其他节点。图的搜索基本上分为深度优先搜索和广度优先搜索。先来说说深度优先搜索。         深度优先搜索包括从一条路径的起始顶点开始追溯,直到到达最后一个顶点,然后回溯,继续追溯下一条路径,直到到达最后的顶点,如此往复,直到没有路径为止。如下图所示: 算法的思路就是访问一个没有访问过的点,将它标记为已访问,再递归去访问在初始顶点的邻接表中其他没有访问过

brizer的博客 2802

飞腾D2000开发板实战:手把手教你为UEFI/EDK2驱动SD3077 RTC时钟芯片

本文详细介绍了在飞腾D2000开发板上为UEFI/EDK2环境驱动SD3077 RTC时钟芯片的全流程开发指南。从硬件连接到软件适配,包括引脚复用配置、电源管理优化以及UEFI驱动的深度定制,帮助开发者解决嵌入式系统中的时间同步问题,确保RTC芯片的稳定性和准确性。

weixin_30892037的博客 423

js算法的深度优先遍历和广度优先遍历

深度优先遍历实现方式1 //深度优先遍历方法 let tree = { id: '1', title: '节点1', children: [ { id: '1-1', title: '节点1-1' }, { id: '1-2', title: '节点1-2', children: [{ id: '2', title: '节点2'

峰会路转的博客 5274

【CarMaker实战指南】从零构建环形测试场景与车辆连续仿真

本文详细介绍了如何使用CarMaker软件从零构建环形测试场景与实现车辆连续仿真。通过分步指导搭建闭环道路、连接交叉路口、规划车辆轨迹等核心操作,帮助用户掌握CarMaker的基础应用技巧,并提供了常见问题排查与进阶优化建议,适用于车辆耐久性测试和自动驾驶算法验证等场景。

weixin_29274969的博客 234

深入学习FIFO

深入理解FIFO、同步FIFO和异步FIFO、FIFO设计的难点以及FIFO深度计算

好好学习,天天向上 2648

javascript中采用深度优先和广度优先遍历DOM树算法

javascript中采用深度优先和广度优先遍历DOM树算法

weixin_51431277的博客 1778

基于Solidworks的三维光路结构示意图绘制实例演示-技术细节

基于Solidworks的三维光路结构示意图绘制实例演示-技术细节

简单光学 1万+

JavaScript算法-深度优先搜索(DFS)/广度优先搜索(BFS)

深度优先搜索(DFS) 事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次. 遍历过程 假定现在有个如下图的二叉树,深度优先搜索1开始遍历子节点,然后从左边树纵深遍历,直到元素不存在子节点,然后回溯,继续遍历子节点,直至左边全部便利完成,回溯到根开始遍历右边树节点.最...

踩蘑菇的小提莫的博客 2800

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JS实现图的BFS和DFS

JS实现图的BFS和DFS 通过在极客时间上学习的算法内容. 我用JS实现图的BFS和DFS. 这里分享给大家. 本文使用图的存储方式是 邻接表 代码中使用的是无向图, 有向图类似. 例子都是从 s 到 t 最后一部分有全部的代码, 和一个小的测试用例 BFS BFS 也就是 Breadth First Search 广度优先搜索 可以理解为地毯式地搜索, 一层一层地搜索. 是不是想起树的层序遍历了? BFS 同样利用了一个 queue 作为辅助工具. 如果, 我们想要向上图一样遍历. 首先我们要解决下面

学习真香 1863

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

算法之深度优先搜素(DFS)和广度优先搜素(BFS)

深度优先搜素(DFS):如果当前节点有孩子,遍历当前孩子再遍历依次兄弟节点的孩子。 <div class="root"> <div class="items"> <ol> <li class="list-item">a</li> </ol> <div class="item"> <s...

薛小科的博客 412

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

深度优先搜索(DFS)与广度优先搜索(BFS):你知道它们的特点和实现吗?

DFS(深度优先搜索)通常使用递归或栈实现。适合解决树形结构问题、发现连通分量、拓扑排序等。BFS(广度优先搜索)通常使用队列实现。适合寻找无权图的最短路径、图的层次遍历等问题。两种遍历方法的选择依赖于具体的应用场景和问题需求。在实际应用中,可以根据需要的特性(如深度约束或宽度优先)选择适合的算法。

你若盛开,清风自来 1526

javascript 图的遍历 BFS DFS

*javascript Dictionary 类 通过HashTable 分离链接法 https://blog.youkuaiyun.com/fareast_mzh/article/details/82432507 *javascript queue 队列类 https://blog.youkuaiyun.com/fareast_mzh/article/details/82560296 *图的遍历 深度...

fareast_mzh的博客 1184

图的深度优先搜索与广度优先搜索---js

参考书籍:《数据结构与算法JavaScript描述》 1. 图 图由边的集合以及顶点的集合组成。例如游戏中的地图,上面含有路线以及地点。地点就可以看作是顶点,路线看作是边。边将顶点连接起来,构成一条条路径。 2. 构建图 function Graph(v) { this.vertices = v; // 顶点个数 this.edges = 0; // 边的条数 this.vertices...

ck_1的博客 323

Js实现图

Js实现图1.图的表示方式2.图的添加操作3.图的toString方法4.图的遍历 1.图的表示方式 ①邻接矩阵 邻接矩阵让每个节点和一个整数相关联,该整数作为数组的下标。用一个二维数组表示顶点之间的连接。在二维数组中,0表示无连接,1表示有连接。邻接矩阵的问题是如果图是个稀疏图,那么会浪费很多空间去存储大量无意义的0. ②邻接表 邻接表由图中每个顶点以及和顶点相邻的顶点列表组成。邻接表可以用map或者哈希表来表示。如图: 邻接表计算出度:直接看每个顶点后边相关的顶点数。 2.图的添加操作 //添加方法(

xiayngbaidu12345的博客 2312

数据结构之图的邻接表实现(包含BFS、DFS的实现)

后附代码 基础知识 有向图中 孤立点:V中不与E中任一条边关联的点称为D的孤立点. 简单图:不含平行边的图称为简单图. 完备图:图中任两个顶点U与u之间,恰有两条有向边(u,v),及(v,u),则称该有向图D为完备图. 基本图:把有向图D的每条边除去定向就得到一个相应的无向图G,称G为D的基本图.称D为G的定向图。 强连通图:给定有向图G=(VE),并且给定该图G中的任意两个结点u和v,如果结点u...

codegun7 1851

图的广度优先遍历算法_「Javascript算法设计」× 广度优先搜索与深度优先搜索...

目录:图的遍历广度优先搜索深度优先搜索为了方便我们理解和实现代码,我们先创建一个图类(Graph)class Graph构造函数可以接收一个参数来表示图是否有向(行{1}),默认情况下,图是无向的。我们使用一个数组来存储图中所有顶点的名字(行{2}),以及一个字典(后面给出定义)来存储邻接表(行{3})。字典将会使用顶点的名字作为键,邻接顶点列表作为值接着我们实现两个方法:一个用来向图中添加一个新...

weixin_39742958的博客 137

【js数据结构】图的深度优先搜索与广度优先搜索

图类的构建 function Graph(v) { this.vertices = v; this.edges = 0; this.adj = [];   for (var i = 0; i < th...

u011927449的博客 203

js版本图的深度优先搜索和广度优先搜索

let generateGraph=require("./graph").generateGraph let V=10 var edges=[[1,0],[1,3],[3,4],[6,4],[8,1],[7,8],[5,9]] console.log(G=generateGraph(V,edges)) function dfs(v,G){ ////用递归实现的dfs v...

weixin_43292547的博客 258

宽度优先搜索算法实现8数码_「Javascript算法设计」× 广度优先搜索与深度优先搜索...

目录:图的遍历广度优先搜索深度优先搜索为了方便我们理解和实现代码,我们先创建一个图类(Graph)class Graph{ constructor(isDirected = false){ this.isDirected = isDirected // {1} this.vertices = [] // {2} this.adjList = new Dictiona...

weixin_29332779的博客 288

算法——深度优先搜索(dfs)和广度优先搜索(bfs)_(JS实现)

问题描述 有一个二维数组map[4][4], [0, 0, 0, 0], [1, 0, 1, 0], [1, 0, 0, 0], [1, 0, 1, 0], 把map[0][0]作为起点,map[4][4]作为终点,如果数组中的值0代表可以通过,1代表无法通过。求出是否能从起点到达终点,如果可以,输出ture,并且输入路径。 一、深度优先搜索(dfs) ① 概念理解:一个人迷路,遇到很多分叉路口,他只有一个人,并且想走出去,所以只能一个个尝试,一条道路走到黑,发现到头了,

weixin_43284350的博客 793
上一篇: javascript实现字典数据结构
下一篇: javascript实现拓扑排序
景洪在编程
博客等级 码龄9年 13粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值