es 实现图的基本算法 图的深度优先搜索 广度优先搜索 普利姆算法

简介: es 实现图的基本算法 图的深度优先搜索 广度优先搜索 普利姆算法
// 图的查找算法
class Node {
    constructor(value) {
        this.value = value;
        this.neighbors = [];
    }
    /**
     * 深度优先查询 查询图
     * @param target {String | Number}
     * @returns {boolean} 结果
     */
    searchByDepth(target = '') {
        if (!this || target.length === 0) return false;
        // 用于保存已经找到的节点
        let exits = [];
        function _searchByDepth(node) {
            if (exits.includes(node)) return false;// 如果已经找过的节点,不用在继续查找
            else if (node.value === target) return true; // 找到了
            else {
                // 去找附近的节点,看看有没有
                exits.push(node);
                for (let i = 0, l = node.neighbors.length; i < l; i++) {
                    if (_searchByDepth(node.neighbors[i])) {
                        return true;
                    }
                }
            }
        }
        return !!_searchByDepth(this);
    }
    /**
     * 图的广度优先搜索
     * @param target {String | Number}
     * @returns {boolean} 结果
     */
    searchByWidth(target = '') {
        if (!this || target.length === 0) return false;
        let exits = []; // 用于保存已经存在的节点
        function _searchByWidth(nodesArr) {
            if (nodesArr.length === 0) return false;
            let nextNodesArr = [];
            for (let i = 0, l = nodesArr.length; i < l; i++) {
                if (nodesArr[i].value === target) return true;
                else {
                    exits.push(nodesArr[i]);
                    nextNodesArr = [...new Set([...nextNodesArr, ...nodesArr[i].neighbors])];
                    for (let j = 0, jl = nextNodesArr.length; j < jl; j++) {
                        if (exits.includes(nextNodesArr[i])) {
                            nextNodesArr.splice(i, 1);
                            j--;
                        }
                    }
                }
            }
            return _searchByWidth(nextNodesArr);
        }
        return _searchByWidth([this]);
    }
    // 普利姆算法
    /**
     * 普利姆算法 最小 生成树 加点法
     * @param nodeArr {Array} 所有的点集
     * @param distance {Array} 所有点的位置
     * @returns {Node}
     */
    prim(nodeArr, distance) {
        if (nodeArr.length !== distance.length || nodeArr.length === 0) return false;
        // 选一个开始的部落
        let nodeGroup = [nodeArr[0]];
        while (nodeGroup.length < nodeArr.length) {
            // 找到离部落最近的点
            let minDisNode = _minDisToGroup();
            // 将点放入到部落
            nodeGroup.push(minDisNode.node);
            // 将找到的点,与部落中的某个点进行连接
            minDisNode.node.neighbors.push(minDisNode.connectNode);
            minDisNode.connectNode.neighbors.push(minDisNode.node);
        }
        /**
         * 找到距离最近的点
         * @returns {{node: null, connectNode: null, dis: number}}
         * @private
         */
        function _minDisToGroup() {
            let result = {
                dis: Infinity, // 距离
                node: null,  // 找到的点
                connectNode: null, // 与部落的哪个点进行连接
            }
            for (let i = 0, l = nodeArr.length; i < l; i++) {
                let findNode = nodeArr[i];
                // 如果找到的当前点在部落中,跳出当前循环
                if (nodeGroup.includes(findNode)) continue;
                // 接下来的点不在部落中,需要进行该点到部落哪个点的距离最近
                let getNodeInfo = _compareNodeDis(findNode);
                if (getNodeInfo.dis < result.dis) {
                    result.dis = getNodeInfo.dis;
                    result.node = findNode;
                    result.connectNode = getNodeInfo.connectNode;
                }
            }
            return result;
        }
        /**
         * 找到离部落最小的距离,并且找到连接部落的哪个点
         * @param node
         * @returns {{connectNode: null, dis: number}}
         * @private
         */
        function _compareNodeDis(node) {
            let res = {
                dis: Infinity,
                connectNode: null,
            }
            // 找到该点距离部落哪个点最近
            for (let j = 0, jl = nodeGroup.length; j < jl; j++) {
                // 拿到部落的点
                let groupNode = nodeGroup[j];
                // 获取部落的点在部落的行
                let row = nodeArr.indexOf(groupNode);
                let col = nodeArr.indexOf(node);
                let dis = distance[row][col];
                if (dis < res.dis) {
                    res.dis = dis;
                    res.connectNode = groupNode;
                }
            }
            return res;
        }
        return this;
    }
}


测试:


let a = new Node('A');
let b = new Node('B');
let c = new Node('C');
let d = new Node('D');
let e = new Node('E');
a.neighbors.push(c, b);
b.neighbors.push(a, e);
c.neighbors.push(a, e, d);
d.neighbors.push(c, e);
e.neighbors.push(b, c, d);
console.log(b.searchByWidth('A')); // true
console.log(b.searchByWidth('F')); // false
console.log(b.searchByDepth('A')); // true
console.log(b.searchByDepth('F')); // false
// 图的最小生成树之prim算法
let a = new Node('A');
let b = new Node('B');
let c = new Node('C');
let d = new Node('D');
let e = new Node('E');
let nodeArr = [a, b, c, d, e];
let distance = [
    [0, 4, 6, Infinity, Infinity],
    [4, 0, Infinity, Infinity, 10],
    [6, Infinity, 0, 3, 7],
    [Infinity, Infinity, 3, 0, 2],
    [Infinity, 10, 7, 2, 0],
]


20201205105220619.png


20201205105229255.png

相关文章
|
6月前
|
算法 测试技术 定位技术
数据结构与算法——DFS(深度优先搜索)
数据结构与算法——DFS(深度优先搜索)
|
17天前
|
人工智能 运维 算法
基于 C# 深度优先搜索算法的局域网集中管理软件技术剖析
现代化办公环境中,局域网集中管理软件是保障企业网络高效运行、实现资源合理分配以及强化信息安全管控的核心工具。此类软件需应对复杂的网络拓扑结构、海量的设备信息及多样化的用户操作,而数据结构与算法正是支撑其强大功能的基石。本文将深入剖析深度优先搜索(Depth-First Search,DFS)算法,并结合 C# 语言特性,详细阐述其在局域网集中管理软件中的应用与实现。
49 3
|
1月前
|
监控 算法 安全
基于 PHP 语言深度优先搜索算法的局域网网络监控软件研究
在当下数字化时代,局域网作为企业与机构内部信息交互的核心载体,其稳定性与安全性备受关注。局域网网络监控软件随之兴起,成为保障网络正常运转的关键工具。此类软件的高效运行依托于多种数据结构与算法,本文将聚焦深度优先搜索(DFS)算法,探究其在局域网网络监控软件中的应用,并借助 PHP 语言代码示例予以详细阐释。
40 1
|
2月前
|
运维 监控 JavaScript
内网网管软件中基于 Node.js 的深度优先搜索算法剖析
内网网管软件在企业网络中不可或缺,涵盖设备管理、流量监控和安全防护。本文基于Node.js实现深度优先搜索(DFS)算法,解析其在网络拓扑遍历中的应用。通过DFS,可高效获取内网设备连接关系,助力故障排查与网络规划。代码示例展示了图结构的构建及DFS的具体实现,为内网管理提供技术支持。
58 11
|
2月前
|
机器学习/深度学习 算法
算法系列之搜索算法-深度优先搜索DFS
深度优先搜索和广度优先搜索一样,都是对图进行搜索的算法,目的也都是从起点开始搜索,直到到达顶点。深度优先搜索会沿着一条路径不断的往下搜索,直到不能够在继续为止,然后在折返,开始搜索下一条候补路径。
138 62
算法系列之搜索算法-深度优先搜索DFS
|
1月前
|
算法 安全 Java
算法系列之深度优先搜索寻找妖怪和尚过河问题的所有方式
在算法学习中,深度优先搜索(DFS)是一种常用的图搜索算法,通过递归或栈实现,适合路径搜索、连通性、拓扑排序、回溯、生成、环路检测、强连通分量和可达性等问题。本文将介绍如何利用深度优先搜索解决“妖怪和尚过河问题”的所有方式。
88 26
算法系列之深度优先搜索寻找妖怪和尚过河问题的所有方式
|
1月前
|
算法 安全 Java
算法系列之广度优先搜索解决妖怪和尚过河问题
BFS 是一种逐层扩展的搜索算法,适用于寻找最短路径。我们可以将每个状态看作图中的一个节点,合法的移动就是节点之间的边。通过 BFS,我们可以找到从初始状态到目标状态的最短路径。
99 30
算法系列之广度优先搜索解决妖怪和尚过河问题
|
1月前
|
算法 Java
算法系列之深度/广度优先搜索解决水桶分水的最优解及全部解
在算法学习中,广度优先搜索(BFS)适用于解决最短路径问题、状态转换问题等。深度优先搜索(DFS)适合路径搜索等问题。本文将介绍如何利用广度优先搜索解决寻找`3 个 3、5、8 升水桶均分 8 升水`的最优解及深度优先搜索寻找可以解决此问题的所有解决方案。
81 7
 算法系列之深度/广度优先搜索解决水桶分水的最优解及全部解
|
30天前
|
监控 算法 JavaScript
企业用网络监控软件中的 Node.js 深度优先搜索算法剖析
在数字化办公盛行的当下,企业对网络监控的需求呈显著增长态势。企业级网络监控软件作为维护网络安全、提高办公效率的关键工具,其重要性不言而喻。此类软件需要高效处理复杂的网络拓扑结构与海量网络数据,而算法与数据结构则构成了其核心支撑。本文将深入剖析深度优先搜索(DFS)算法在企业级网络监控软件中的应用,并通过 Node.js 代码示例进行详细阐释。
39 2
|
1月前
|
存储 算法 JavaScript
基于 Node.js 深度优先搜索算法的上网监管软件研究
在数字化时代,网络环境呈现出高度的复杂性与动态性,上网监管软件在维护网络秩序与安全方面的重要性与日俱增。此类软件依托各类数据结构与算法,实现对网络活动的精准监测与高效管理。本文将深度聚焦于深度优先搜索(DFS)算法,并结合 Node.js 编程语言,深入剖析其在上网监管软件中的应用机制与效能。
35 6
下一篇
oss创建bucket