队列的JS实现及广度优先搜索(BFS)的实现
队列是先进先出(FIFO)的数据结构,插入操作叫做入队,只能添加在队列的末尾;删除操作叫做出队,只能移除第一个元素。在JS中,用数组可以很简单的实现队列。JavaScript实现排序算法
function Queue () {
this.queue = [];
}
// 增加
Queue.prototype.enQueue = function(x) {
this.queue.push(x);
return true;
}
// 删除
Queue.prototype.deQueue = function() {
if(this.isEmpty()) {
return false;
}
this.queue.shift();
return true;
}
// 获取队首元素
Queue.prototype.front = function() {
if(this.isEmpty()) {
return false;
}
this.queue[0];
}
// 是否为空
Queue.prototype.isEmpty = function() {
return !this.queue.length
}
以上就实现了队列的数据结构,那么队列这种数据结构有什么作用呢?在广度优先搜索(BFS)中,很适合队列。那什么是BFS。在树的遍历中,有两种遍历方式,其中一种就是从根节点一层一层的往下遍历,这就是广度优先;另一种是先由根节点选一条路径直接遍历到叶子节点,这就是深度优先搜索(DFS)。队列可以用在BFS中,下面我们来实现一个广度优先搜索的例子,返回目标节点深度。
let root = {
key: 1,
children: [
{
key:2,
},
{
key:3,
children:[
{
key:4,
}
]
}
]
} // 数据源
function bfs(root, target) {
//利用上面创建的Queue,当然也可以直接用数组实现
let queue = new Queue();
let step = 0; // 根节点到目标节点之间的深度
queue.enQueue(root); //将根节点加入
//遍历队列
while(!queue.isEmpty()) {
step += 1;
let len = queue.length;
// 分层遍历队列,没有目标元素则删除该层元素,继续遍历下一层
for(let i =0; i<len; i++) {
let cur = queue.front() // 获取队首元素
if(target === cur.key) return step; //如果是目标元素,返回
// 如果不是,将下一层节点加入到队列
if(cur.children && cur.children.length) {
cur.children.map(item => {
queue.enQueue(item)
})
}
queue.deQueue() //然后将遍历过的节点删除,
}
}
}
bfs(root,4)
这样我们就完成了BFS的实现思路,大家可已参照该思路在具体的业务中灵活运用BFS。
原文地址:
队列是先进先出(FIFO)的数据结构,插入操作叫做入队,只能添加在队列的末尾;删除操作叫做出队,只能移除第一个元素。在JS中,用数组可以很简单的实现队列。
function Queue () {
this.queue = [];
}
// 增加
Queue.prototype.enQueue = function(x) {
this.queue.push(x);
return true;
}
// 删除
Queue.prototype.deQueue = function() {
if(this.isEmpty()) {
return false;
}
this.queue.shift();
return true;
}
// 获取队首元素
Queue.prototype.front = function() {
if(this.isEmpty()) {
return false;
}
this.queue[0];
}
// 是否为空
Queue.prototype.isEmpty = function() {
return !this.queue.length
}
以上就实现了队列的数据结构,那么队列这种数据结构有什么作用呢?在广度优先搜索(BFS)中,很适合队列。那什么是BFS。在树的遍历中,有两种遍历方式,其中一种就是从根节点一层一层的往下遍历,这就是广度优先;另一种是先由根节点选一条路径直接遍历到叶子节点,这就是深度优先搜索(DFS)。队列可以用在BFS中,下面我们来实现一个广度优先搜索的例子,返回目标节点深度。
let root = {
key: 1,
children: [
{
key:2,
},
{
key:3,
children:[
{
key:4,
}
]
}
]
} // 数据源
function bfs(root, target) {
//利用上面创建的Queue,当然也可以直接用数组实现
let queue = new Queue();
let step = 0; // 根节点到目标节点之间的深度
queue.enQueue(root); //将根节点加入
//遍历队列
while(!queue.isEmpty()) {
step += 1;
let len = queue.length;
// 分层遍历队列,没有目标元素则删除该层元素,继续遍历下一层
for(let i =0; i<len; i++) {
let cur = queue.front() // 获取队首元素
if(target === cur.key) return step; //如果是目标元素,返回
// 如果不是,将下一层节点加入到队列
if(cur.children && cur.children.length) {
cur.children.map(item => {
queue.enQueue(item)
})
}
queue.deQueue() //然后将遍历过的节点删除,
}
}
}
bfs(root,4)
这样我们就完成了BFS的实现思路,大家可已参照该思路在具体的业务中灵活运用BFS。
原文地址:https://segmentfault.com/a/1190000016900956
队列的JS实现及广度优先搜索(BFS)的实现的更多相关文章
- 深度优先搜索DFS和广度优先搜索BFS简单解析(新手向)
深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每个点仅被访问一次,这个过程就是图的遍历.图的遍历常用的有深度优先搜索和广度优先搜索,这两者对于有向图和无向图 ...
- 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)
需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...
- 深度优先搜索DFS和广度优先搜索BFS简单解析
转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...
- 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS
词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...
- 广度优先搜索 BFS 学习笔记
广度优先搜索 BFS 学习笔记 引入 广搜是图论中的基础算法之一,属于一种盲目搜寻方法. 广搜需要使用队列来实现,分以下几步: 将起点插入队尾: 取队首 \(u\),如果 $u\to v $ 有一条路 ...
- 广度优先搜索(BFS)
定义 维基百科:https://en.wikipedia.org/wiki/Breadth-first_search 给定图G=(V,E)和一个可识别的源结点s,广度优先搜索对图G中的边进行系统性的探 ...
- 数据结构和算法总结(一):广度优先搜索BFS和深度优先搜索DFS
前言 这几天复习图论算法,觉得BFS和DFS挺重要的,而且应用比较多,故记录一下. 广度优先搜索 有一个有向图如图a 图a 广度优先搜索的策略是: 从起始点开始遍历其邻接的节点,由此向外不断扩散. 1 ...
- 深度优先搜索DFS和广度优先搜索BFS
DFS简介 深度优先搜索,一般会设置一个数组visited记录每个顶点的访问状态,初始状态图中所有顶点均未被访问,从某个未被访问过的顶点开始按照某个原则一直往深处访问,访问的过程中随时更新数组visi ...
- 广度优先搜索 BFS算法
广度优先搜索算法(Breadth-First-Search,BFS),又称作宽度优先搜索.BFS算法是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点均被访问,则算法中止. 算法思想 1.首先将根 ...
随机推荐
- bzoj 4010: [HNOI2015]菜肴制作【拓扑排序】
也就是给定有向图,求最小字典序的拓扑序,直接用小根堆就行(或者反着建图用大根堆) #include<iostream> #include<cstdio> #include< ...
- P5024 保卫王国
传送门 我现在还是不明白为什么NOIPd2t3会是一道动态dp-- 首先关于动态dp可以看这里 然后这里就是把把矩阵给改一改,改成这个形式\[\left[dp_{i-1,0},dp_{i-1,1}\r ...
- IT兄弟连 JavaWeb教程 Servlet表单乱码问题
在使用原生的Servlet进行Web应用开发时经常会遇到一些中文乱码问题,造成乱码问题的原因只有一个:即客户端与服务端的字符编码不一致所导致的. 请求参数乱码问题 服务器端获取客户端传递过来的数据出现 ...
- IT兄弟连 Java Web教程 Tomcat
本文采用的Tomcat服务器版本是Tomcat8.5版本,Tomcat8.5支持Servlet3.1.JSP2.3以及EL3.0规范.并且Tomcat8.5版本对JDK8的支持比Tomcat8更加全面 ...
- Beautiful People SGU - 199 ZOJ - 2319
最长上升子序列O(n log n):http://www.cnblogs.com/hehe54321/p/cf-340d.html 题目:https://cn.vjudge.net/problem/Z ...
- Chips CodeForces - 333B
Chips CodeForces - 333B 题意:有一个n*n的棋盘,其中有m个格子被禁止.在游戏开始前要将一些芯片(?)放到四条边上(但不能是角上).游戏开始后,每次操作将每一个芯片移动到它四周 ...
- javascript简单的表单验证
<html> <head> <title>用户登录</title> <script language="javascript" ...
- ubuntu 16.0.4安装MySQL5.7
系统版本 root@sishen:~# uname -a Linux sishen 4.10.0-35-generic #39~16.04.1-Ubuntu SMP Wed Sep 13 09:02: ...
- Suricata的命令行解释
见官网 https://suricata.readthedocs.io/en/latest/command-line-options.html root@SELKS:~# suricata Suric ...
- hihocoder1067 最近公共祖先·二
思路: 使用tarjan算法,这是一种离线算法. 实现: #include <bits/stdc++.h> using namespace std; typedef pair<int ...