2017-04-17 25 views
-2

我有一個定義了一組關係,例如詞典:跟蹤項之間的關係在一本字典

relationships = {"Fred": ["Mary, John"], 
       "Mary": ["Fred", "Alex"], 
       "John": ["Fred"] 
       "Alex": ["Mary"]} 

我想打造一些功能,給定的名字我返回所有列表與該名稱相關的關係。

直接關係通過Key:Value對(因此Mary與Fred直接相關)發出信號,第二級關係通過「朋友的朋友」類型關係發出信號。所以Alex和Fred通過Mary有一段感情。亞歷克斯 - >瑪麗 - >弗雷德。

例如: 輸入:弗雷德, 輸出:瑪麗,約翰,亞歷克斯

輸入:亞歷克斯, 輸出:瑪麗,弗雷德,約翰

我用這個例子來嘗試的學習遞歸,所以我有一個遞歸解決方案,但我不確定這是否可以迭代完成,或者如何構建適當的遞歸來解決此問題。

+0

要顯示我們的任何代碼? – Astrom

+0

歡迎來到StackOverflow。請閱讀並遵守幫助文檔中的發佈準則。 [在主題](http://stackoverflow.com/help/on-topic)和[如何提問](http://stackoverflow.com/help/how-to-ask)適用於此處。 StackOverflow不是一個設計,編碼,研究或教程服務。 – Prune

回答

1

您可以嘗試某種圖搜索作爲您的問題的一般解決方案。然後,每個連接的組件代表一組直接或通過另一個人相互認識的人。

在你的情況,該圖是這樣的:

relationships graph

因此,從您的查詢中指定一個人出發訪問所有後代頂點。

+1

感謝您的提示,我能夠掀起一個簡單的DFS,似乎解決了手頭的問題! –

0

您可以搜索詞典以查找所有關係。

relationships = {"Fred": ["Mary", "John"], 
       "Mary": ["Fred", "Alex"], 
       "John": ["Fred"] 
       "Alex": ["Mary"]} 

def findRelation(name): 
    res = relationships.get(name) 
    next = set(res) 
    visited = set() 
    while next: 
     current = [] 
     for friend in next: 
      if friend in visited: continue 
      visited.add(friend) 
      item = relationships.get(friend) 
      if item: 
       res.extend(item) 
       current.extend(item) 
     next = set(current) 
    return set(res)- set([name]) 


findRelation('Fred') 
set(['John', 'Alex', 'Mary']) 

findRelation('Alex') 
set(['John', 'Mary', 'Fred'])