2015-08-23 17 views
-1

給定一個表示社交網絡的數據結構,編寫一個查找某種程度的朋友的函數。第一學位的朋友是會員的直接朋友,第二學位的朋友是除一級朋友之外的會員朋友的朋友等。在C#中使用某種模式實現這一點的最佳方式是什麼?

例如,如果A是朋友,B和B是朋友,C ,那麼GetFriendsOfDegree(A,2)應該返回C,因爲C是A的唯一二級朋友(B是A的一級朋友)。

Method name: GetFriendsOfDegree 

using System; 
using System.Collections.Generic; 

public class Member 
{ 
    public string Email { get; private set; } 

    public ICollection<Member> Friends { get; private set; } 

    public Member(string email) : this(email, new List<Member>()) 
    { 
    } 

    public Member(string email, ICollection<Member> friends) 
    { 
     this.Email = email; 
     this.Friends = friends; 
    } 

    public void AddFriends(ICollection<Member> friends) 
    { 
     foreach (Member friend in friends) 
      this.Friends.Add(friend); 
    } 

    public void AddFriend(Member friend) 
    { 
     this.Friends.Add(friend); 
    } 
} 

public class Friends 
{ 
    public static List<Member> GetFriendsOfDegree(Member member, int degree) 
    { 
     throw new NotImplementedException("Waiting to be implemented."); 
    } 

    public static void Main(string[] args) 
    { 
     Member a = new Member("A"); 
     Member b = new Member("B"); 
     Member c = new Member("C"); 

     a.AddFriend(b); 
     b.AddFriend(c); 

     foreach (Member friend in GetFriendsOfDegree(a, 2)) 
      Console.WriteLine(friend.Email); 
    } 
} 
+1

家庭作業?真的嗎?... – squill25

+0

不..只是wa'nna檢查我是否用正確的方式,或者有人有另一個理想來實現?! –

回答

1

這是一個圖形問題,可以用breadth-first search算法解決。您將該圖表示爲adjacency list非常適合實現BFS算法。

建立配對隊列(Member, distance)和一組訪問成員。按距離零推入最初的成員​​。

創建一個從隊列讀取的循環,並檢查成員是否爲訪問集的一部分。如果是,請放下這對貨物並繼續。否則,推送距離爲d+1的當前成員的所有朋友,其中d是您已出隊的成員的距離。

當距離達到目標距離degree時,將該成員收集到結果列表中。繼續循環,直到隊列爲空。

+0

酷...好的理想,但我的理念是使用一些設計模式...簡單直觀 –

+0

@YuriDuretti設計模式是關於不同的抽象層次。當你所需要的只是實現一個類的單一方法時,你需要一個算法,而不是設計模式。 – dasblinkenlight

+0

耶!!!我同意,,,只是wa'nna檢查我是否使用正確的方式,或者有人有另一個理想來實現?! –

相關問題