我在代码库中遇到了这个方法,并想知道Big O是什么.该方法采用一个平面列表并创建一个树,在它去的时候分配父和子值.
private void AddChildren(Group group, IEnumerable<Group> groups)
{
foreach (var g in groups)
{
if (g.ParentId == group.Id)
{
g.Parent = group;
group.Children.Add(g);
AddChildren(g, groups);
}
}
}
Run Code Online (Sandbox Code Playgroud)
已经有一段时间了,因为我在识别直接的n ^ 2(或更糟)方法之外做了Big O,但我对它的看法是这样的:
只是扔东西,所以我可以看看我是否在球场:
n +(x*n)
其中x是if循环中的匹配数.
关于这实际上是什么的任何想法都会很棒,谢谢.
观察到每个父子关系只调用一次递归函数.在具有n个节点的树结构中,存在n-1个这样的关系,因此AddChildren()被称为n次(包括初始调用).在每次调用中,由于迭代,方法本身执行的工作(不包括递归调用)是O(n).因此,总共O(n ^ 2).
您可以先将所有组放在一个hashmap中,然后遍历列表一次,在hashmap中查找每个父节点,从而提高O(n)的复杂性.