用Javascript实现有向图的广度优先搜索

刚好遇到一个需求,对于一个有向图,指定一个节点 i 作为起点,输出从 i 出发,可以到达的所有节点,也就是图中以 i 作为起点的子连通片,思考了一下,可以用以前学的广度优先搜索解决。

一、有向图的存储

我们用一个邻接矩阵(二维数组)存储有向图的信息,对于一个矩阵graph,若graph[i][j] = true,则表示存在一条由节点 i 到 j 的边。

// 使用d3读取json文件
d3.json("test.json", function(error, graph) {
// 构造邻接矩阵
var graph_array = new Array();
graph.links.forEach(function(d){
if(!graph_array[d.source])
{
graph_array[d.source]= new Array();
}
graph_array[d.source][d.target] = true;
});
}

二、广度优先搜索(Breadth First Search)

步骤:

(0)创建一个队列存储经过的节点,把当前节点初始化为 i ,并将其入队(push)

(1)进行一次出队操作(pop),得到队首的节点 j(此时应把j记录下来,作为返回结果),遍历以 j 为起点的边,把这些边的终点节点依次入队

(2)判断队列是否为空,若是,则返回结果;若否,则跳回第一步继续执行。

算法的时间复杂度为O(n²)

具体代码如下:

function breadth_first_search(graph_array, root)
{
var ret_nodes = {}; // 用于存储经过的节点
var queue = [];
queue.push(root); do
{
var current_node = queue.shift();
ret_nodes[current_node] = true; for(var i = 0; graph_array[current_node] && i < graph_array[current_node].length; i++)
{
if(graph_array[current_node][i])
{
queue.push(i);
}
}
}while(queue.length !== 0); return ret_nodes;
}

Javascript —— 有向图广度优先搜索的更多相关文章

  1. 总结A*,Dijkstra,广度优先搜索,深度优先搜索的复杂度比较

    广度优先搜索(BFS) 1.将头结点放入队列Q中 2.while Q!=空 u出队 遍历u的邻接表中的每个节点v 将v插入队列中 当使用无向图的邻接表时,复杂度为O(V^2) 当使用有向图的邻接表时, ...

  2. 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)

    深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...

  3. 数据结构和算法总结(一):广度优先搜索BFS和深度优先搜索DFS

    前言 这几天复习图论算法,觉得BFS和DFS挺重要的,而且应用比较多,故记录一下. 广度优先搜索 有一个有向图如图a 图a 广度优先搜索的策略是: 从起始点开始遍历其邻接的节点,由此向外不断扩散. 1 ...

  4. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...

  5. python 实现图的深度优先和广度优先搜索

    在介绍 python 实现图的深度优先和广度优先搜索前,我们先来了解下什么是"图". 1 一些定义 顶点 顶点(也称为"节点")是图的基本部分.它可以有一个名称 ...

  6. (转)广度优先搜索BFS和深度优先搜索DFS

    1. 广度优先搜索介绍 广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索",简称BFS. 它的思想是:从图中 ...

  7. python实现广度优先搜索和深度优先搜索

    图的概念 图表示的是多点之间的连接关系,由节点和边组成.类型分为有向图,无向图,加权图等,任何问题只要能抽象为图,那么就可以应用相应的图算法. 用字典来表示图 这里我们以有向图举例,有向图的邻居节点是 ...

  8. C语言数据结构与算法之深度、广度优先搜索

    一.深度优先搜索(Depth-First-Search 简称:DFS) 1.1 遍历过程: (1)从图中某个顶点v出发,访问v. (2)找出刚才第一个被顶点访问的邻接点.访问该顶点.以这个顶点为新的顶 ...

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

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

随机推荐

  1. BZOJ1857 Scoi2010 传送带 【三分】

    BZOJ1857 Scoi2010 传送带 Description 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P ...

  2. c++ template不能有cpp

    c++的template只能把生命和定义都放在.h文件里,不然会出错

  3. 异步加载JS几种方式

    默认情况javascript是同步加载的,也就是javascript的加载时阻塞的,后面的元素要等待javascript加载完毕后才能进行再加载,对于一些意义不是很大的javascript,如果放在页 ...

  4. drone 学习三 条件步骤

    1. 基本格式 pipeline: slack: image: plugins/slack channel: dev + when: + branch: master 2. 几种条件类型 a. bra ...

  5. sailsjs 不用写代码就能生成rest api 代码

    1. 脚手架安装 npm install sails -g     2. 生成基本项目 a. 项目 sails new appdemo b. 创建api sails new api demoapi a ...

  6. Hyper-V 手动导入虚机配置实例(转载)

    原文转载:http://blog.51cto.com/bobzy/980241 Hyper-V提供了很方便的虚机导入和导出功能.平时假如我们想导出虚机,先选中虚机,然后鼠标右键在出现菜单列表中选中“导 ...

  7. 老齐python-基础5(运算符、语句)

    1.运算符 1.1算术运算符 1.2比较运算符 >>> a = 10 >>> b = 20 >>> a > b False >> ...

  8. Unit02: JDBC核心API

    Unit02: JDBC核心API db.properties 注意:如果使用连接池,可以在这个文件中增加对连接池的相关设置: 连接池参数,常用参数有: 初始连接数 最大连接数 最小连接数 每次增加的 ...

  9. qt的webkit

    qt4里面,在pro文件添加 QT += webkit qt5里面,在pro文件添加 QT += webkit webkitwidgets 备注: webkit不支持静态编译

  10. java根据特定密钥对字符串进行加解密

    package com.test; import java.io.IOException; import java.security.SecureRandom; import javax.crypto ...