JS实现图的BFS和DFS

JS实现图的BFS和DFS

通过在极客时间上学习的算法内容.
我用JS实现图的BFS和DFS.

这里分享给大家.

本文使用图的存储方式是 邻接表

代码中使用的是无向图, 有向图类似.

例子都是从 s 到 t
最后一部分有全部的代码, 和一个小的测试用例

BFS

BFS 也就是 Breadth First Search
广度优先搜索

可以理解为地毯式地搜索, 一层一层地搜索.
是不是想起树的层序遍历了?

BFS 同样利用了一个 queue 作为辅助工具.

在这里插入图片描述

如果, 我们想要向上图一样遍历. 首先我们要解决下面的三个问题

  1. 访问过的顶点, 不能再访问了
  2. 要记录到某一顶点前经过的顶点
  3. 需要一层一层顶点的地遍历

为了解决这三个问题, 我们引入了三个重要的辅助变量

  1. visited 一个数组, 大小为顶点的个数, 默认都是false , 用于记录顶点是否被访问;
  2. prev 一个数组, 大小为顶点的个数. 默认值为 -1, 用于记录访问到该顶点的前一个顶点
  3. queue 队列(js中可以直接使用数组), 用于存储层序遍历时的顶点

层序搜索, 获取到的路径是 最短路径

  // 广度优先搜索
  // 最短路径
  breadth_first_search(s, t) {
   
    const prev = new Array(this.v).fill(-1);
    // 用于记录 顶点是否被访问过
    const visited = new Array(this.v).fill(false);
    // 用于记录 访问到该节点的前一个节点
    // 用于遍历顶点, 一层一层地遍历
    const queue = [s];
    // 循环结束的条件
    // 找到t, 或者queue为空
    let prev_v = null;
    while (queue.length !== 0) {
   
      let cur = queue.shift();
      visited[cur] = true;
      // 当前顶点的邻接表
      let cur_list = this.adj[cur];

      let unvisited = cur_list
        // 遍历 cur_list中没有被访问过的节点
        .filter((node) => {
   
          return !visited[node];
        });

      for (let index = 0; index < unvisited.length; index++) {
   
        const node = unvisited[index];
        // 设置 prev 和 visited
        prev[node] = cur;
        visited[node] = true;
        // 如果有t 结束
        if (node === t) {
   
          return prev;
        } else {
   
          // 没有 将其放入 queue中,继续循环
          queue.push(node);
        }
      }
    }
    this.print_path(s, t, prev);
    return 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值