列出两个给定朋友之间的所有 link 个朋友

List all link of friends between two given Friends

据说所有人之间平均只有六个或更少的社交关系。 创建一个应用程序,帮助您找到任意两个人之间的分离程度。 将其视为 select 在 Facebook 上访问两个用户并试图了解这两个人的情况 已连接。

如果你 select 任何两个人,你应该能够看到 它们之间的分离程度。 例如,如果您在系统中添加了以下关系...

如果你 select 两个人,比方说 Sameer 和 Bhaskar,应用程序应该显示学位 分离如下。

我必须在 Node.js 应用程序中实现这个逻辑! 我尝试了使用图形链接列表的不同方法,但找不到实现此方法的解决方案。

我使用了递归我尝试了 DFS 但我无法实现它
我在基本 JSON 中获取数据并在旅途中更新它,因为如果问题没有指定你的目标值将在 6 个朋友连接下,这个函数可以处于无限循环中。

[
  {
    "name": "samer",
    "friends": ["aayushi", "kamalnath"]
  },
  {
    "name": "aayushi",
    "friends": ["bhaskar"]
  },
  {
    "name": "kamalnath",
    "friends": ["shanti"]
  },
  {
    "name": "shanti",
    "friends": ["bhaskar"]
  }
]

function find(value1,value2,path){
if(count > 6)
  while(true){
  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])
            break;
           }
        else{
            find(Data[i].friends[j],value2,path)
           }
        }
      }
    }
  }
}}
var path = [];
find("samer","bhaskar",path,6)

//Output --> [[aayushi],[kamalnath,shanti]]

阅读您 post 的答案(将来您可能只需编辑 post),您几乎明白了。您可以通过将 JSON 预处理为邻接列表图来提高 DFS 的效率,并且可以通过跟踪您之前访问过的朋友来避免无限循环(这样您就不会多次访问他们并循环无限循环)。

邻接表 Graph 只是 Graph 的一种表示,您在对象中将顶点列表作为键存储,并将它们相邻(连接)的所有其他顶点的列表作为值存储。例如,Graph 会将键 "sameer" 映射到列表 ["aayushi", "kamalnath"]。这样一来,每次调用 find 时,就不必遍历所有 Data 来查找 value1。你可以通过 Graph[value1] 找到 value1 的朋友。 (为了清楚起见,我在下面的代码中将 value1 重命名为 source,将 value2 重命名为 target 以及其他一些变量名称更改。

至于避免循环,您可以在一个简单的 javascript 对象(或集合)中跟踪您已经访问过的朋友,初始化为空并在您访问每个新朋友时添加到递归调用,然后只需将此对象传递给每个递归调用。您在每次调用开始时检查它以确保您没有进入循环。这对于您在树上执行的 DFS/BFS 搜索(根据定义是非循环图)不是必需的,但对于可能具有 loops/cycles.

的一般图来说是必需的

另一件小事是,当您找到目标时 value/friend,您

if(Data[i].friends[j] == value2){
  path.push(Data[i].friends[j])
  break;
}

在这种情况下你不递归是对的,但如果你想继续搜索你正在循环的其他朋友的替代路径(而不仅仅是打破并返回你找到的第一条路径)。

此外,我不确定这是否是故意的,但在示例数据中,友谊似乎是单向的(例如,shanti 是 bhaskar 的朋友,但 bhaskar 没有列出朋友)。如果它们是 2 种方式,您可能会稍微更改将连接列表预处理为图形的方式。无论如何,这是包含我提到的所有更改的代码。如果不清楚请告诉我:

// 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))