当前位置:首页 > JavaScript

js实现bfs

2026-03-13 22:39:40JavaScript

实现BFS的基本概念

BFS(广度优先搜索)是一种用于遍历或搜索树或图的算法。它从根节点开始,逐层访问所有相邻节点,确保先访问所有相邻节点后再进入下一层。

使用队列实现BFS

BFS通常使用队列来管理待访问的节点。队列的先进先出特性确保节点按照层级顺序被处理。

function bfs(graph, startNode) {
    const visited = new Set();
    const queue = [startNode];
    visited.add(startNode);

    while (queue.length > 0) {
        const currentNode = queue.shift();
        console.log(currentNode); // 处理当前节点

        for (const neighbor of graph[currentNode]) {
            if (!visited.has(neighbor)) {
                visited.add(neighbor);
                queue.push(neighbor);
            }
        }
    }
}

示例图的表示

图可以用邻接表的形式表示,例如:

js实现bfs

const graph = {
    'A': ['B', 'C'],
    'B': ['A', 'D', 'E'],
    'C': ['A', 'F'],
    'D': ['B'],
    'E': ['B', 'F'],
    'F': ['C', 'E']
};

调用BFS函数

传入图结构和起始节点,即可执行BFS遍历:

bfs(graph, 'A');

处理有向图或无向图

上述代码适用于无向图。对于有向图,邻接表的构建方式会有所不同,但BFS的实现逻辑不变。

js实现bfs

记录路径信息

如果需要记录从起始节点到其他节点的路径,可以修改BFS函数:

function bfsWithPath(graph, startNode) {
    const visited = new Set();
    const queue = [startNode];
    const paths = { [startNode]: [startNode] };
    visited.add(startNode);

    while (queue.length > 0) {
        const currentNode = queue.shift();

        for (const neighbor of graph[currentNode]) {
            if (!visited.has(neighbor)) {
                visited.add(neighbor);
                paths[neighbor] = [...paths[currentNode], neighbor];
                queue.push(neighbor);
            }
        }
    }
    return paths;
}

处理加权图

对于加权图,BFS通常不适用,因为其无法保证找到最短路径(权重和最小)。此时应使用Dijkstra算法或A*算法。

性能注意事项

  • 使用Set来记录已访问节点,确保O(1)时间复杂度的查找。
  • 对于大规模图,需注意队列的内存消耗。
  • 避免在循环中频繁操作DOM或其他高成本操作,以免影响性能。

标签: jsbfs
分享给朋友:

相关文章

jquery.js

jquery.js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,用于简化 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它的设计宗旨是“Write Less, Do Mor…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:CSS…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…