队列是先进先出(FIFO)的数据结构,插入操作叫做入队,只能添加在队列的末尾;删除操作叫做出队,只能移除第一个元素。在JS中,用数组可以很简单的实现队列。JavaScript实现排序算法

  1. function Queue () {
  2. this.queue = [];
  3. }
  4. // 增加
  5. Queue.prototype.enQueue = function(x) {
  6. this.queue.push(x);
  7. return true;
  8. }
  9. // 删除
  10. Queue.prototype.deQueue = function() {
  11. if(this.isEmpty()) {
  12. return false;
  13. }
  14. this.queue.shift();
  15. return true;
  16. }
  17. // 获取队首元素
  18. Queue.prototype.front = function() {
  19. if(this.isEmpty()) {
  20. return false;
  21. }
  22. this.queue[0];
  23. }
  24. // 是否为空
  25. Queue.prototype.isEmpty = function() {
  26. return !this.queue.length
  27. }

以上就实现了队列的数据结构,那么队列这种数据结构有什么作用呢?在广度优先搜索(BFS)中,很适合队列。那什么是BFS。在树的遍历中,有两种遍历方式,其中一种就是从根节点一层一层的往下遍历,这就是广度优先;另一种是先由根节点选一条路径直接遍历到叶子节点,这就是深度优先搜索(DFS)。队列可以用在BFS中,下面我们来实现一个广度优先搜索的例子,返回目标节点深度。

  1. let root = {
  2. key: 1,
  3. children: [
  4. {
  5. key:2,
  6. },
  7. {
  8. key:3,
  9. children:[
  10. {
  11. key:4,
  12. }
  13. ]
  14. }
  15. ]
  16. } // 数据源
  17. function bfs(root, target) {
  18. //利用上面创建的Queue,当然也可以直接用数组实现
  19. let queue = new Queue();
  20. let step = 0; // 根节点到目标节点之间的深度
  21. queue.enQueue(root); //将根节点加入
  22. //遍历队列
  23. while(!queue.isEmpty()) {
  24. step += 1;
  25. let len = queue.length;
  26. // 分层遍历队列,没有目标元素则删除该层元素,继续遍历下一层
  27. for(let i =0; i<len; i++) {
  28. let cur = queue.front() // 获取队首元素
  29. if(target === cur.key) return step; //如果是目标元素,返回
  30. // 如果不是,将下一层节点加入到队列
  31. if(cur.children && cur.children.length) {
  32. cur.children.map(item => {
  33. queue.enQueue(item)
  34. })
  35. }
  36. queue.deQueue() //然后将遍历过的节点删除,
  37. }
  38. }
  39. }
  40. bfs(root,4)

这样我们就完成了BFS的实现思路,大家可已参照该思路在具体的业务中灵活运用BFS。

原文地址:

队列是先进先出(FIFO)的数据结构,插入操作叫做入队,只能添加在队列的末尾;删除操作叫做出队,只能移除第一个元素。在JS中,用数组可以很简单的实现队列。

  1. function Queue () {
  2. this.queue = [];
  3. }
  4. // 增加
  5. Queue.prototype.enQueue = function(x) {
  6. this.queue.push(x);
  7. return true;
  8. }
  9. // 删除
  10. Queue.prototype.deQueue = function() {
  11. if(this.isEmpty()) {
  12. return false;
  13. }
  14. this.queue.shift();
  15. return true;
  16. }
  17. // 获取队首元素
  18. Queue.prototype.front = function() {
  19. if(this.isEmpty()) {
  20. return false;
  21. }
  22. this.queue[0];
  23. }
  24. // 是否为空
  25. Queue.prototype.isEmpty = function() {
  26. return !this.queue.length
  27. }

以上就实现了队列的数据结构,那么队列这种数据结构有什么作用呢?在广度优先搜索(BFS)中,很适合队列。那什么是BFS。在树的遍历中,有两种遍历方式,其中一种就是从根节点一层一层的往下遍历,这就是广度优先;另一种是先由根节点选一条路径直接遍历到叶子节点,这就是深度优先搜索(DFS)。队列可以用在BFS中,下面我们来实现一个广度优先搜索的例子,返回目标节点深度。

  1. let root = {
  2. key: 1,
  3. children: [
  4. {
  5. key:2,
  6. },
  7. {
  8. key:3,
  9. children:[
  10. {
  11. key:4,
  12. }
  13. ]
  14. }
  15. ]
  16. } // 数据源
  17. function bfs(root, target) {
  18. //利用上面创建的Queue,当然也可以直接用数组实现
  19. let queue = new Queue();
  20. let step = 0; // 根节点到目标节点之间的深度
  21. queue.enQueue(root); //将根节点加入
  22. //遍历队列
  23. while(!queue.isEmpty()) {
  24. step += 1;
  25. let len = queue.length;
  26. // 分层遍历队列,没有目标元素则删除该层元素,继续遍历下一层
  27. for(let i =0; i<len; i++) {
  28. let cur = queue.front() // 获取队首元素
  29. if(target === cur.key) return step; //如果是目标元素,返回
  30. // 如果不是,将下一层节点加入到队列
  31. if(cur.children && cur.children.length) {
  32. cur.children.map(item => {
  33. queue.enQueue(item)
  34. })
  35. }
  36. queue.deQueue() //然后将遍历过的节点删除,
  37. }
  38. }
  39. }
  40. bfs(root,4)

这样我们就完成了BFS的实现思路,大家可已参照该思路在具体的业务中灵活运用BFS。

原文地址:https://segmentfault.com/a/1190000016900956

队列的JS实现及广度优先搜索(BFS)的实现的更多相关文章

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

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

  2. 利用广度优先搜索(BFS)与深度优先搜索(DFS)实现岛屿个数的问题(java)

    需要说明一点,要成功运行本贴代码,需要重新复制我第一篇随笔<简单的循环队列>代码(版本有更新). 进入今天的主题. 今天这篇文章主要探讨广度优先搜索(BFS)结合队列和深度优先搜索(DFS ...

  3. 深度优先搜索DFS和广度优先搜索BFS简单解析

    转自:https://www.cnblogs.com/FZfangzheng/p/8529132.html 深度优先搜索DFS和广度优先搜索BFS简单解析 与树的遍历类似,图的遍历要求从某一点出发,每 ...

  4. 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS

    词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...

  5. 广度优先搜索 BFS 学习笔记

    广度优先搜索 BFS 学习笔记 引入 广搜是图论中的基础算法之一,属于一种盲目搜寻方法. 广搜需要使用队列来实现,分以下几步: 将起点插入队尾: 取队首 \(u\),如果 $u\to v $ 有一条路 ...

  6. 广度优先搜索(BFS)

    定义 维基百科:https://en.wikipedia.org/wiki/Breadth-first_search 给定图G=(V,E)和一个可识别的源结点s,广度优先搜索对图G中的边进行系统性的探 ...

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

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

  8. 深度优先搜索DFS和广度优先搜索BFS

    DFS简介 深度优先搜索,一般会设置一个数组visited记录每个顶点的访问状态,初始状态图中所有顶点均未被访问,从某个未被访问过的顶点开始按照某个原则一直往深处访问,访问的过程中随时更新数组visi ...

  9. 广度优先搜索 BFS算法

    广度优先搜索算法(Breadth-First-Search,BFS),又称作宽度优先搜索.BFS算法是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点均被访问,则算法中止. 算法思想 1.首先将根 ...

随机推荐

  1. Jquery禁用网页右键菜单

    $(function(){ $(document).bind("contextmenu",function(e){ return false; }); });

  2. Eclipse新建Maven webapp项目错误的解决方法

    新建webapp项目时出现如下错误: 解决步骤如下: 1.  右键点击项目,选择Properties,点击Java Build Path,将默认的JRE移除,点击右侧add Library,选择JRE ...

  3. Zookeeper(1、3、5节点)集群安装

    1节点 1 week110的zookeeper的安装 + zookeeper提供少量数据的存储 3节点 hadoop-2.6.0.tar.gz的集群搭建(3节点) hadoop-2.6.0-cdh5. ...

  4. hdu6201 transaction transaction transaction(from 2017 ACM/ICPC Asia Regional Shenyang Online)

    最开始一直想着最短路,不过看完题解后,才知道可以做成最长路.唉,还是太菜了. 先上图: 只要自己添加两个点,然后如此图般求最长路即可,emmm,用SPFA可以,迪杰斯特拉也可以,或者别的都ok,只要通 ...

  5. 寻找项目中顶级Vue对象 (一)

    个人博客首发博客园: http://www.cnblogs.com/zhangrunhao/ 参考 感谢作者 从一个奇怪的错误出发理解 Vue 基本概念 安装 - Vue.js 渲染函数 - Vue. ...

  6. 题解报告:hdu 2196 Computer(树形dp)

    Problem Description A school bought the first computer some time ago(so this computer's id is 1). Du ...

  7. Intel手册 Chapter23 VMX的简单介绍

    23.2  虚拟机架构 1: VMX为处理器上的虚拟机定义了处理器级的支持.VMX主要支持两类,VMM和VM 2: VMM作为HOST可以完全控制处理器和其他平台硬件. 每个VM都支持一个栈,并且由O ...

  8. (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案二

    http://blog.csdn.net/yerenyuan_pku/article/details/52894958 前面我们已经集成了Spring4.2.5+Hibernate4.3.11+Str ...

  9. ElasticSearch可视化工具 Kibana

    Kibana要和ElasticSearch 版本一致,默认的端口号是:5601

  10. win10使用自带虚拟机没有Hyper-V场景

    开始咯~ 1.打开控制面板-程序和功能-启用或关闭Windows功能 2.发现下面并没有Hyper-v 真难受~~~   然后百度了一下原来是家庭版的win10没有.那就只能往下面看咯~ 3.在桌面添 ...