在熟人名单中查找名字的复杂性是什么

时间:2019-01-17 02:26:40

标签: algorithm data-structures

例如,我有一个人员类,它具有名称和相识属性,名称是字符串,而相识是人员数组。我想写一个方法来接收一个名称作为参数,然后在人的熟人列表和熟人列表中的熟人中找到它的名字,等等,直到人的熟人为空或找到名字为止。

以下是代码。也可以有圆环,如何避免这种情况。 预先感谢您对这个问题的关注。

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");

1 个答案:

答案 0 :(得分:1)

您可以在线性(O(n))时间内执行这种操作。 为此,您必须将图形保持为adjacency list

您可以一次变换树(使用DFS遍历),也可以只将图最初保留为列表而不是树。

您可以在线性时间(如果您将使用hashMap / hashTable / dictionary,甚至是恒定的O(1)时间)中在邻接表中轻松找到一个人及其联系。

否则,您将必须执行DFS遍历并保存已访问节点的列表(集合),以避免循环。取决于您将用于访问列表的数据结构,您可以具有不同的复杂度-从O(n)到O(n ^ 2)。但是在所有情况下,每次遍历都需要2n的内存(例如,如果您要并行进行多次搜索)。