[英]List all link of friends between two given Friends
据说所有人之间的社交联系平均只有六个或更少。 创建一个应用程序,帮助您找到任何两个人之间的分离程度。 把它想象成在 Facebook 上选择两个用户并试图了解这两个人是如何联系在一起的。
如果您选择任意两个人,您应该能够看到他们之间的分离程度。 例如,如果您将以下关系添加到您的系统中...
如果您选择两个人,比如 Sameer 和 Bhaskar,应用程序应显示如下分离程度。
我必须在 Node.js 应用程序中实现这个逻辑! 我使用图形链接列表尝试了不同的方法,但找不到实现这一点的解决方案。
我使用了递归我尝试了 DFS 但我无法实现它
var ok = true;
while(ok){
for(var i in Data){
if(Data[i].name == value1){
for(var j in Data[i].friends){
if(Data[i].friends[j] == value2){
path.push(Data[i].friends[j])
ok = false;
}else{
find(Data[i].friends[j],value2,path)
}
}
}
}
}
}
阅读您发布的答案(将来您可能只是编辑您的帖子),您几乎明白了。 您可以通过将您的 JSON 预处理为邻接列表图来提高 DFS 的效率,并且您可以通过跟踪您之前访问过哪些朋友来避免无限循环(这样您就不会多次访问他们并无限循环)。
邻接列表 Graph 只是 Graph 的一种表示,其中您将顶点列表作为键存储在对象中,并将它们相邻(连接)到的所有其他顶点的列表作为值存储。 例如,图表会将键"sameer"
映射到列表["aayushi", "kamalnath"]
。 这使得每次调用find
,您不必遍历所有Data
来查找value1
。 您可以通过执行Graph[value1]
找到value1
的朋友。 (为了清楚起见,我将value1
重命名为source
,将value2
重命名为target
,并在下面的代码中对其他一些变量名称进行了更改)。
至于避免循环,您可以在一个简单的 javascript 对象(或集合)中跟踪您已经访问过的朋友,将其初始化为空并在递归调用开始时在您访问每个新朋友时添加,然后将此对象向下传递每次递归调用。 您在每次调用开始时检查它以确保您没有进入循环。 这对于您在树(根据定义为非循环图)执行的 DFS/BFS 搜索不是必需的,但对于可能具有循环/循环的一般图是必需的。
另一件小事是当你找到你的目标价值/朋友时,你有
if(Data[i].friends[j] == value2){
path.push(Data[i].friends[j])
break;
}
在这种情况下不递归是对的,但是如果您希望能够继续搜索正在循环的其他朋友以寻找替代路径(而不仅仅是中断并返回第一个),您可能不想中断你找到的路径)。
另外,我不确定这是否是故意的,但在示例数据中,友谊似乎是单向的(例如 shanti 是 bhaskar 的朋友,但 bhaskar 没有列出朋友)。 如果它们是 2 种方式,您可能会稍微更改将连接列表预处理为 Graph 的方式。 无论如何,这是我提到的所有更改的代码。 如果不清楚,请告诉我:
// preprocess a JSON list of connections to an adjacency list Graph function connectionsListToGraph(connections) { const Graph = {} for (let { name, friends } of connections) { Graph[name] = friends // allow fast lookup of a given person's friends } return Graph } // return the list of connections between source and target function getConnections(source, target, connections) { const Graph = connectionsListToGraph(connections) const connectionPaths = [] function findConnectionsDFS(source, target, path = [source], visited = {}) { // Don't search/visit the same friend twice (to avoid infinite loops) if (visited[source]) return; // mark that we've searched the current source friend visited[source] = true; for (let friend of Graph[source]) { if (friend === target) { connectionPaths.push(path.concat(target)); } else { findConnectionsDFS(friend, target, path.concat(friend), visited) } } } findConnectionsDFS(source, target); return connectionPaths; } let connections = [ { "name": "sameer", "friends": ["aayushi", "kamalnath"] }, { "name": "aayushi", "friends": ["bhaskar"] }, { "name": "kamalnath", "friends": ["shanti"] }, { "name": "shanti", "friends": ["bhaskar"] } ] console.log('Sameer to Bhaskar:', getConnections('sameer', 'bhaskar', connections)) console.log('Kamalnath to Bhaskar:', getConnections('kamalnath', 'bhaskar', connections))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.