例如,我有一个人员类,它具有名称和相识属性,名称是字符串,而相识是人员数组。我想写一个方法来接收一个名称作为参数,然后在人的熟人列表和熟人列表中的熟人中找到它的名字,等等,直到人的熟人为空或找到名字为止。
以下是代码。也可以有圆环,如何避免这种情况。 预先感谢您对这个问题的关注。
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");
答案 0 :(得分:1)
您可以在线性(O(n))时间内执行这种操作。 为此,您必须将图形保持为adjacency list
您可以一次变换树(使用DFS遍历),也可以只将图最初保留为列表而不是树。
您可以在线性时间(如果您将使用hashMap / hashTable / dictionary,甚至是恒定的O(1)时间)中在邻接表中轻松找到一个人及其联系。
否则,您将必须执行DFS遍历并保存已访问节点的列表(集合),以避免循环。取决于您将用于访问列表的数据结构,您可以具有不同的复杂度-从O(n)到O(n ^ 2)。但是在所有情况下,每次遍历都需要2n的内存(例如,如果您要并行进行多次搜索)。