队列的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.首先将根 ...
随机推荐
- 黑客攻防技术宝典web实战篇:定制攻击自动化习题
猫宁!!! 参考链接:http://www.ituring.com.cn/book/885 随书答案. 1. 指出使用自动技巧在应用程序中枚举标识符时用到的 3 个标识符“触点”. (a) HTTP ...
- SpringBoot的配置文件加载顺序以及如何获取jar包里的资源路径
一.读取配置文件的四种方式 这四种配置文件放置方式的读取优先级依次递减,具体可以查看官方文档. 1.1jar包同级目录下的config文件夹里的配置文件 其实我以前就见过这种方式了,只是不知道怎么做的 ...
- memcache操作
1 格式(telnet) <command name> <key> <flags> <exptime> <bytes> a) <com ...
- Lightoj 1038 - Race to 1 Again (概率DP)
题目链接: Lightoj 1038 - Race to 1 Again 题目描述: 给出一个数D,每次可以选择数D的一个因子,用数D除上这个因子得到一个新的数D,为数D变为1的操作次数的期望为多少 ...
- Educational Codeforces Round 46 (Rated for Div. 2) E. We Need More Bosses
Bryce1010模板 http://codeforces.com/contest/1000/problem/E 题意: 给一个无向图,求图的最长直径. 思路:对无向图缩点以后,求图的最长直径 #in ...
- Maximal Area Quadrilateral CodeForces - 340B || 三点坐标求三角形面积
Maximal Area Quadrilateral CodeForces - 340B 三点坐标求三角形面积(可以带正负,表示向量/点的不同相对位置): http://www.cnblogs.com ...
- h5-16-SVG 与 HTML5 的 canvas 各自特点
1. Canvas是使用JavaScript程序绘图(动态生成),SVG是使用XML文档描述来绘图.2.SVG更适合用来做动态交互,而且SVG绘图很容易编辑,只需要增加或移除相应的元素就可以了.同时S ...
- Apex 使用和学习
ref doc http://o7planning.org/en/10345/oracle-apex-tutorial-for-beginners (change from web to pdf) ...
- 关于itchat用法的一篇博文
itchat的原理就是利用爬虫爬取了网页版微信的内容,并进行一系列的操作,运用微信,通过手机与电脑时登录的互通性,可以实现用微信对电脑的操作,通过itchat.msg_register方法,可以得到目 ...
- React.js 的 context
这一节我们来介绍一个你可能永远用不上的 React.js 特性 —— context.但是了解它对于了解接下来要讲解的 React-redux 很有好处,所以大家可以简单了解一下它的概念和作用. 在过 ...