当前位置:首页 > JavaScript

js实现拓扑

2026-02-01 10:02:04JavaScript

拓扑排序简介

拓扑排序是一种对有向无环图(DAG)的线性排序算法,使得对于图中的每一条有向边 (u, v),u 在排序中总是位于 v 的前面。常用于任务调度、依赖关系分析等场景。

实现步骤

  1. 构建图的邻接表表示 使用对象或数组存储每个节点的邻接节点,并记录每个节点的入度(指向该节点的边数)。

  2. 初始化队列 将所有入度为0的节点加入队列,这些节点没有前置依赖,可以直接处理。

  3. 处理队列中的节点 依次从队列中取出节点,将其加入排序结果。同时遍历该节点的邻接节点,减少它们的入度。若邻接节点入度变为0,则加入队列。

  4. 检查是否存在环 若最终排序结果包含所有节点,则拓扑排序成功;否则图中存在环,无法完成拓扑排序。

    js实现拓扑

代码实现

function topologicalSort(graph) {
    const inDegree = {};
    const queue = [];
    const result = [];

    // 初始化入度
    for (const node in graph) {
        inDegree[node] = 0;
    }

    // 计算每个节点的入度
    for (const node in graph) {
        for (const neighbor of graph[node]) {
            inDegree[neighbor]++;
        }
    }

    // 将入度为0的节点加入队列
    for (const node in inDegree) {
        if (inDegree[node] === 0) {
            queue.push(node);
        }
    }

    // 处理队列中的节点
    while (queue.length) {
        const current = queue.shift();
        result.push(current);

        for (const neighbor of graph[current]) {
            inDegree[neighbor]--;
            if (inDegree[neighbor] === 0) {
                queue.push(neighbor);
            }
        }
    }

    // 检查是否有环
    if (result.length !== Object.keys(graph).length) {
        throw new Error("图中存在环,无法进行拓扑排序");
    }

    return result;
}

// 示例用法
const graph = {
    'A': ['B', 'C'],
    'B': ['D'],
    'C': ['D'],
    'D': []
};

console.log(topologicalSort(graph)); // 输出: ['A', 'B', 'C', 'D'] 或 ['A', 'C', 'B', 'D']

复杂度分析

  • 时间复杂度:O(V + E),其中 V 是节点数,E 是边数。需要遍历所有节点和边。
  • 空间复杂度:O(V),用于存储入度表和队列。

注意事项

  • 确保输入是有向无环图(DAG),否则会抛出异常。
  • 对于同一张图,可能存在多个有效的拓扑排序结果(如示例中的两种输出)。

标签: 拓扑js
分享给朋友:

相关文章

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js轮播图实现原理

js轮播图实现原理

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

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…