我有一个有向图,其中路径存储在JSON数组中。它是源和目的地的形式。
Var pathDirection = [{"Source":2,"Destination":3},
{"Source":3,"Destination":4},
{"Source":5,"Destination":4},
{"Source":2,"Destination":5},
{"Source":4,"Destination":6}];
在上面使用它形成如下结构的图形。
我的问题是我不知道起点,我必须找到从任何节点到达6的所有可能路径
与上图相似,达到6的不同路径是
输出:
[4 ->6]
[3->4 ->6]
[5->4 ->6]
[2->5->4 ->6]
[2->3->4 ->6]
我曾尝试使用回溯来写下algo,这种方式很好但是找了一些最好的算法来寻找。请建议任何其他可能的方法,以及如何优化以下程序。
// BackTrack From End Node Destination 6
var getAllSource = function(destId){
var sourceForsameDist = [];
pathDirection.forEach(function(eachDirection){
if(eachDirection.Destination == destId){
sourceForsameDist.push(eachDirection.Source);
}
});
return sourceForsameDist;
};
var diffPath = [];
var init = function(destination){
var sourceId = getAllSource(destination[destination.length - 1]);
if(sourceId.length === 0){
diffPath.push(destination);
}
for(var i=0;i<sourceId.length;i++){
var copy = destination.slice(0);
copy.push(sourceId[i]);
init(copy);
}
};
init([6]);
console.log(diffPath); // [[6,4,3,2],[6,4,5,2]]
答案 0 :(得分:1)
我曾尝试使用回溯功能,但工作正常但寻找最好的算法才能找到。
我称之为Depth-First-Search而不是backtracking,但是算法很好。
但是,我对实施有一些建议:
diffPath
作为本地变量,return
函数init
if(sourceId.length === 0)
条件,那么您将获得预期的输出,而不仅仅是来自源的路径pathDirection
函数中的整个getAllSource
,我会使用在开始遍历之前填充的查找表init
重命名为更有意义的内容