繁体   English   中英

列出两个给定好友之间的所有好友链接

[英]List all link of friends between two given Friends

据说所有人之间的社交联系平均只有六个或更少。 创建一个应用程序,帮助您找到任何两个人之间的分离程度。 把它想象成在 Facebook 上选择两个用户并试图了解这两个人是如何联系在一起的。

如果您选择任意两个人,您应该能够看到他们之间的分离程度。 例如,如果您将以下关系添加到您的系统中...

  • Sameer 是 Aayushi 的朋友
  • Aayushi 是 Bhaskar 的朋友
  • Sameer 是 Kamalnath Sharma 的朋友
  • Kamalnath Sharma 是 Shanti Kumar Saha 的朋友
  • Shanti Kumar Saha 是 Bhaskar 的朋友

如果您选择两个人,比如 Sameer 和 Bhaskar,应用程序应显示如下分离程度。

  • Sameer > Aayushi > Bhaskar
  • Sameet > Kamalnath Sharma > Shanti Kumar Saha > 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM