如何计算此Q& A流的最短和最长路径?

时间:2013-11-28 16:26:00

标签: javascript json recursion shortest-path longest-path

我有以下Q& A流程:

enter image description here

基本思想是,根据为问题选择的答案,接下来会问一个不同的问题。

我目前使用以下JavaScript对象代表此Q& A流程:

var QAndAObj = {
  1: {
    question: 'Question 1',
    answers: [
      {
        answerText: 'Answer 1-1',
        nextQuestion: 2
      },
      {
        answerText: 'Answer 1-2',
        nextQuestion: 3
      }
    ]
  },
  2: {
    question: 'Question 2',
    answers: [
      {
        answerText: 'Answer 2-1',
        nextQuestion: 3
      },
      {
        answerText: 'Answer 2-2',
        nextQuestion: null
      }
    ]
  },
  3: {
    question: 'Question 3',
    answers: [
      {
        answerText: 'Answer 3-1',
        nextQuestion: 4
      },
      {
        answerText: 'Answer 3-2',
        nextQuestion: null
      },
      {
        answerText: 'Answer 3-3',
        nextQuestion: null
      }
    ]
  },
  4: {
    question: 'Question 4',
    answers: [
      {
        answerText: 'Answer 4-1',
        nextQuestion: null
      },
      {
        answerText: 'Answer 4-2',
        nextQuestion: null
      }
    ]
  }
};

为了向用户显示进度条,我希望能够计算问题流程中的最长和最短路径。

我最初的想法是编写一个像下面这样的递归函数来记录流程中的每个可能路径:

function recurse(node) {
  for (var i = 0; i < node.answers.length; i++) {
    if (node.answers[i].nextQuestion) {
      recurse(QAndAObj[node.answers[i].nextQuestion]);
    }
  }
}

上面的函数允许我命中流中的每个节点,但我不知道如何计算流中最长和最短的路径。

非常感谢任何帮助/建议/代码 非常感谢你。

2 个答案:

答案 0 :(得分:2)

看一下这个jsFiddle的实例。

function shortAndLong(QATree, startNode) {
    var paths = [];
    function findAllPaths(startNode, currentCost) {
        for (var i = 0; i < startNode.answers.length; i++) {
            var child = startNode.answers[i];
            if (child.nextQuestion == null) {
                paths.push(currentCost);
            }else {
                findAllPaths(QATree[child.nextQuestion], currentCost+1);
            }
        }
    }
    findAllPaths(startNode, 1);
    return [Math.min.apply(Math, paths), Math.max.apply(Math, paths)]
}
console.debug('ans',shortAndLong(QAndAObj, QAndAObj[1]));//returns [2, 4]
console.debug('ans',shortAndLong(QAndAObj, QAndAObj[2]));//returns [1, 3]
console.debug('ans',shortAndLong(QAndAObj, QAndAObj[3]));//returns [1, 2]
console.debug('ans',shortAndLong(QAndAObj, QAndAObj[4]));//returns [1, 1]

基础是

  1. 创建图表中所有路径的列表,保留所需的答案数量
  2. 查找最大值和最小值

答案 1 :(得分:0)

var lengthLongestPath = function(input) {
    let maxLength = 0;
    let pathLength = { 0: 0 }
    let lines = input.split("\n");

    for (let i = 0; i < lines.length; i++) {
        let name = lines[i].replace(/\t/g,"");
        let depth = lines[i].length - name.length;

        if (name.includes(".")) {
            maxLength = Math.max(maxLength, pathLength[depth] + name.length);
        } else {
            pathLength[depth + 1] = pathLength[depth] + name.length + 1;
        }
    }

    return maxLength;
};
console.log(lengthLongestPath("dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext"))