簡體   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