列出开放有限定向图中给定节点的所有可能路径

时间:2017-03-27 11:42:50

标签: javascript arrays depth-first-search

我有一个像这样的对象集合:

[
 {key:8, parent:'none'},
 {key:5, parent:8},
 {key:3, parent:5},
 {key:2, parent:3},
 {key:4, parent:5},
 {key:1, parent:4},
 {key:3, parent:4},
 {key:2, parent:3},
]

所有可能的路径:

8->5->3->2
8->5->4->1
8->5->4->3->2

生成尽可能多的字符串的最简单方法是什么。可能的路径,每个字符串的值是路径序列?

我知道的方式要求我有嵌套循环(顺序n ^ 2),这是最佳算法。

请注意,上述结构是有向非循环图上DFS的结果(如果此信息以任何方式帮助,即在dfs迭代期间记录信息)

1 个答案:

答案 0 :(得分:3)

您可以使用递归方法来构建路径数组,因为您有{key:2, parent:3}两次可以使用Set并结束删除重复项。

var data = [{key:8, parent:'none'},{key:5, parent:8},{key:3, parent:5},{key:2, parent:3},{key:4, parent:5},{key:1, parent:4},{key:3, parent:4}, {key:2, parent:3}]

var result = []

function buildStrings(arr, parent, c) {
  return arr.reduce(function(r, e) {
    if (e.parent == parent) {
      var children = buildStrings(arr, e.key, c + e.key + '->')
      if (!children.length) result.push(c + e.key)
      r.push(e)
    }
    return r;
  }, [])
}

buildStrings(data, 'none', '')
result = [...new Set(result)]

console.log(result)