队列的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.首先将根 ...
随机推荐
- size_t与size_type区别
size() 标准库string里面有个函数size,用来返回字符串中的字符个数,具体用法如下: string st("The expense of spirit\n");cou ...
- 正睿OI提高组十连测 day1 总结
可能是最简单的一场比赛了吧,结果却打得这么差... T1是个找规律题,结果一开始愚蠢地找错了规律,然后又对拍,到1h多一点才过掉 然后看t2和t3,以为t2是个水题,t3也只要处理一下就好了,先写t2 ...
- HDU - 6063 RXD and math
Bryce1010模板 http://acm.hdu.edu.cn/showproblem.php?pid=6063 打表发现规律是n^k #include <iostream> #inc ...
- Lucky Array Codeforces - 121E && Bear and Bad Powers of 42 Codeforces - 679E
http://codeforces.com/contest/121/problem/E 话说这题貌似暴力可A啊... 正解是想出来了,结果重构代码,调了不知道多久才A 错误记录: 1.线段树搞混num ...
- Pursuit For Artifacts CodeForces - 652E
https://vjudge.net/problem/CodeForces-652E 边双啊,就是点双那个tarjan里面,如果low[v]==dfn[v](等同于low[v]>dfn[u]), ...
- CGI和Servlet的比较
转载自:http://www.maxhis.info/java/cgi-vs-servlet/ 概括来说,CGI和Servlet可以完成相同的功能. CGI(Common Gateway Interf ...
- c#很好用的定时器Quartz--含附件
1.引用附件中的两个DLL 2.创建类 public class QuartzJob:IStatefulJob { private static ISchedulerFactory factory = ...
- Tomcat+Jenkins+SonarQube+SVN+Maven 集成自动化环境搭建(Windows10环境下)
说在前面的话: 从接到任务到完成共用了7天的时间.正常人用不到这个时间. 此时的功能表现是: 登录本地JenKins对项目进行构建,能够自动从SVN读取最新代码并按照Maven项目构建,构建完成能够自 ...
- Git之删除本地和远程项目
目录 删除本地项目 删除远程项目 删除本地项目: git rm -rf project 或者 rm -rf project [删除工作区项目] git add project [将删除的项目添加 ...
- 新建cordova应用,插件开发教程系列(总目录)
以下几篇是连续的教程,代码也是连续的,包括如下章节: 新建cordova应用 https://www.cnblogs.com/cannel/p/11074359.html 使用cordova把h5应用 ...