JS简易拓扑排序

piziji1年前动动脑434
const nodeCount = 5;

/**@type {number[]} */
let graphNodes = Array(nodeCount)
  .fill(0)
  .map((item, index) => index);

/**@type {number[][]} */
const graphEdges = {
  0: [1],
  1: [3],
  2: [3, 4],
  3: [4],
};

/**
 *
 * @param {number[]} graphNodes
 * @param {number[][]} graphEdges
 * @returns {nodeType[]}
 */
const generateGraph = (graphNodes, graphEdges) => {
  graphNodes = graphNodes.map((item, index) => {
    const tempNode = { value: index, next: null };
    return tempNode;
  });

  Object.entries(graphEdges).map(([value, edges]) => {
    graphNodes[value].next = edges.reduce((res, toNode) => {
      let tempRes = res;
      while (tempRes.next) tempRes = tempRes.next;
      tempRes.next = { value: toNode - 0, next: null };
      return res;
    }, {}).next;
  });

  return graphNodes;
};

const graph = generateGraph(graphNodes, graphEdges);

const getDegree = (graph) => {
  const degree = Array(nodeCount).fill(0);
  for (let i = 0; i < graph.length; i++) {
    let node = graph[i].next;
    while (node) {
      degree[node.value]++;
      node = node.next;
    }
  }

  return degree;
};

const topoLogicSort = (graph) => {
  const sortArray = [];
  const stack = [];
  const degree = getDegree(graph);
  for (let i = 0; i < degree.length; i++) {
    if (degree[i] == 0) stack.push(i);
  }

  while (stack.length !== 0) {
    const currentNode = stack.pop();
    sortArray.push(currentNode);
    for (let node = graph[currentNode].next; node; node = node.next) {
      if (--degree[node.value] == 0) stack.push(node.value);
    }
  }

  if (sortArray.length < nodeCount) {
    console.log("there is a loop");
    return;
  }

  return sortArray;
};

const sortArray = topoLogicSort(graph);
console.log(sortArray);
// [ 2, 0, 1, 3, 4 ]


标签: 前端

相关文章

uniapp input获取扫描头条码不全问题

uniapp input获取扫描头条码不全问题

一、原因分析input使用双向绑定,input标签loop事件循环获取文本过程中,读取信息不是顺序读取,如果条码中包含了回车键,还没有读取完所有文本,先读取到了回车,触发了相应的回车事件导致取到的条码...

Chrome调试工具-基础篇

Chrome调试工具-基础篇

1、打开Chorme开发者工具在 Chrome 菜单中选择更多工具 > 开发者工具在页面元素上右键点击,选择 “检查”使用快捷键 F12、 Ctrl+Shift+I2、查看元素伪类 css 样式...

召唤伊斯特瓦尔