例如,我有一个person类,它有name和熟人属性,name是string,熟人是persons数组。我想写一个方法,接收一个名字作为param,并找到它的名字在个人的熟人名单和熟人名单等熟人,深,直到个人熟人是无效的或名字被发现。
下面是代码。也可以有循环,如何避免。
提前感谢你对这个问题的关心。

class P
{
    public string Name;
    public P[] Acquaintances;
    public P(string name, P[] acquaintances)
    {
        if (String.IsNullOrWhiteSpace(name))
        {
            throw new ArgumentException("Name cannot be null or white space.",
             "name");
        }

        this.Name = name;
        this.Acquaintances = acquaintances;
    }
    public bool FindAcquaintance(string name)
    {
        if (String.IsNullOrWhiteSpace(name))
        {
            throw new ArgumentException("Name cannot be null or white space.",
             "name");
        }
        if (Name.Equals(name))
        {
            return true;
        }
        if (Acquaintances == null || Acquaintances.Length == 0)
        {
            return false;
        }
        foreach (P acquaintance in this.Acquaintances)
        {
            if (acquaintance.Name.Equals(name))
            {
                return true;
            }
            if (acquaintance.FindAcquaintance(name))
            {
                return true;
            }
        }
        return false;
    }
}

用法
P person = new P("Alex",
            new P[] {
                new P("Bob",   new P[] { new P("James", new P[] { }) }),
                new P("Kavin", new P[] { new P("Brent", null) })
            });


bool found = person.FindAcquaintance("Brent");

最佳答案

你可以在线性(O(n))时间内执行这种操作。
为此,您必须将图形保持为adjacency list
您可以转换树(使用dfs遍历)一次,也可以将图形最初保留为列表而不是树。
你可以很容易地在线性时间(如果你将使用hashMap/hashTable/dictionary,甚至是常数O(1)时间)的邻接列表中找到一个人,以及他的联系。
否则,必须执行DFS遍历并保存已访问节点的列表(集)以避免周期根据访问列表中使用的数据结构,可以有不同的复杂度,从O(n)到O(n ^ 2)。但在所有情况下,每次遍历都需要2n内存(例如,如果有多个并行搜索)。

10-06 14:52