在c#中使用某种模式来实现这一点的最佳方法是什么?

本文关键字:这一点 实现 最佳 方法 是什么 模式 | 更新日期: 2023-09-27 18:09:17

给定一个表示社交网络的数据结构,编写一个查找一定程度的朋友的函数。第一级的朋友是成员的直系朋友,第二级的朋友是成员的朋友的朋友,不包括第一级的朋友,等等。

例如,如果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);
    }
}

在c#中使用某种模式来实现这一点的最佳方法是什么?

这是一个可以用宽度优先搜索算法解决的图问题。您将图表示为邻接表非常适合实现BFS算法。

创建一个由对(Member, distance)组成的队列,以及一组访问过的成员。推入距离为0的初始成员

创建一个从队列中读取数据的循环,并检查该成员是否属于被访问集合。如果是,就放下这对继续。否则,以d+1的距离推当前成员的所有朋友,其中d是您已退出队列的成员的距离。

当距离达到degree的目标距离时,将成员收集到结果列表中。继续循环,直到队列为空。