当前位置:首页 > 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中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(func,…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js图片轮播的实现

js图片轮播的实现

基础图片轮播实现 使用HTML、CSS和JavaScript实现一个简单的图片轮播效果。HTML部分定义轮播容器和图片,CSS负责样式和过渡效果,JavaScript处理逻辑。 <div cl…

实现继承js

实现继承js

实现继承的方式 在JavaScript中,实现继承可以通过多种方式完成,每种方式都有其优缺点。以下是几种常见的实现继承的方法: 原型链继承 原型链继承是最基本的继承方式,通过将子类的原型指向父类的实…

js 实现页面刷新

js 实现页面刷新

使用 location.reload() location.reload() 是原生 JavaScript 提供的页面刷新方法。调用该方法会重新加载当前页面,相当于点击浏览器的刷新按钮。 // 基本…