当前位置:首页 > JavaScript

js实现图

2026-02-28 19:40:53JavaScript

实现图的基本结构

在JavaScript中,图(Graph)可以通过邻接表或邻接矩阵实现。邻接表适合稀疏图,节省空间;邻接矩阵适合稠密图,便于快速查询。

js实现图

邻接表实现

class Graph {
  constructor() {
    this.adjacencyList = new Map();
  }

  addVertex(vertex) {
    if (!this.adjacencyList.has(vertex)) {
      this.adjacencyList.set(vertex, []);
    }
  }

  addEdge(vertex1, vertex2) {
    this.adjacencyList.get(vertex1).push(vertex2);
    this.adjacencyList.get(vertex2).push(vertex1); // 无向图需双向添加
  }
}

邻接矩阵实现

class Graph {
  constructor(numVertices) {
    this.matrix = Array(numVertices)
      .fill()
      .map(() => Array(numVertices).fill(0));
  }

  addEdge(v1, v2) {
    this.matrix[v1][v2] = 1;
    this.matrix[v2][v1] = 1; // 无向图需对称设置
  }
}

图的遍历算法

图的遍历包括深度优先搜索(DFS)和广度优先搜索(BFS)。

js实现图

深度优先搜索(DFS)

dfs(startVertex) {
  const visited = new Set();
  const _dfs = (vertex) => {
    visited.add(vertex);
    console.log(vertex);
    for (const neighbor of this.adjacencyList.get(vertex)) {
      if (!visited.has(neighbor)) {
        _dfs(neighbor);
      }
    }
  };
  _dfs(startVertex);
}

广度优先搜索(BFS)

bfs(startVertex) {
  const visited = new Set();
  const queue = [startVertex];
  visited.add(startVertex);

  while (queue.length) {
    const vertex = queue.shift();
    console.log(vertex);
    for (const neighbor of this.adjacencyList.get(vertex)) {
      if (!visited.has(neighbor)) {
        visited.add(neighbor);
        queue.push(neighbor);
      }
    }
  }
}

图的路径算法

常见路径算法包括Dijkstra(最短路径)和拓扑排序(有向无环图)。

Dijkstra算法(加权图最短路径)

dijkstra(startVertex) {
  const distances = {};
  const priorityQueue = new PriorityQueue();
  this.adjacencyList.forEach((_, vertex) => {
    distances[vertex] = vertex === startVertex ? 0 : Infinity;
    priorityQueue.enqueue(vertex, distances[vertex]);
  });

  while (!priorityQueue.isEmpty()) {
    const currentVertex = priorityQueue.dequeue().value;
    for (const neighbor of this.adjacencyList.get(currentVertex)) {
      const edgeWeight = 1; // 假设权重为1,实际需根据具体图调整
      const newDistance = distances[currentVertex] + edgeWeight;
      if (newDistance < distances[neighbor]) {
        distances[neighbor] = newDistance;
        priorityQueue.enqueue(neighbor, newDistance);
      }
    }
  }
  return distances;
}

拓扑排序(有向无环图)

topologicalSort() {
  const visited = new Set();
  const result = [];
  const _visit = (vertex) => {
    visited.add(vertex);
    for (const neighbor of this.adjacencyList.get(vertex)) {
      if (!visited.has(neighbor)) {
        _visit(neighbor);
      }
    }
    result.unshift(vertex); // 逆序插入
  };
  this.adjacencyList.forEach((_, vertex) => {
    if (!visited.has(vertex)) _visit(vertex);
  });
  return result;
}

实际应用示例

社交网络关系图

const socialGraph = new Graph();
socialGraph.addVertex("Alice");
socialGraph.addVertex("Bob");
socialGraph.addVertex("Charlie");
socialGraph.addEdge("Alice", "Bob");
socialGraph.addEdge("Bob", "Charlie");
socialGraph.bfs("Alice"); // 输出: Alice, Bob, Charlie

路径规划(Dijkstra)

const cityGraph = new Graph();
cityGraph.addVertex("A");
cityGraph.addVertex("B");
cityGraph.addVertex("C");
cityGraph.addEdge("A", "B", 4); // 假设权重为4
cityGraph.addEdge("B", "C", 2);
console.log(cityGraph.dijkstra("A")); // 输出: { A: 0, B: 4, C: 6 }

标签: js
分享给朋友:

相关文章

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previo…

js实现vue路由

js实现vue路由

Vue 路由的基本实现 在 Vue.js 中实现路由功能通常使用 Vue Router 库。Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。 安装 Vue R…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js实现原理

js实现原理

JavaScript 实现原理 JavaScript 是一种解释型语言,其实现原理涉及多个核心组件和运行机制,包括引擎、运行时环境、事件循环等。 引擎与解释执行 现代 JavaScript 引擎(如…

js 实现拖拽

js 实现拖拽

实现拖拽的基本步骤 在JavaScript中实现拖拽功能需要监听几个关键事件:mousedown、mousemove和mouseup。以下是实现的基本逻辑。 监听目标元素的mousedown事件,记…

js实现文件夹

js实现文件夹

使用JavaScript创建文件夹 在浏览器端的JavaScript中无法直接操作文件系统创建文件夹,这是出于安全考虑。但在Node.js环境中可以通过文件系统模块(fs)实现。 Node.js中使…