微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

此方法的Big O符号是什么?

如何解决此方法的Big O符号是什么?

| 我在代码库中遇到了这种方法,想知道Big O是什么。该方法采用一个平面列表并创建一棵树,并随其分配Parent和Children值。
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);
        }
    }
}
自从我完成Big O以来已经有一段时间了,除了确定简单的n ^ 2(或更糟糕的)方法之外,但是我的看法是这样的: 我们正在迭代列表中的每个节点,从而使我们 我们使用条件处理要迭代的项的子集。这里可能有多个匹配项,并且不知道如何表达该数字,或者不知道如何修改对AddChildren的递归调用 我们有一些简单的任务,我不知道是否需要+1修饰符 我们正在递归,但不是在封闭的迭代中针对每个项目 只是在外面扔东西,这样我就能知道我是否在球场上: n +(x * n) 其中x是if循环中的匹配数。 谢谢任何对这实际上是什么的想法。     

解决方法

        请注意,每个父子关系仅调用一次递归函数。在具有n个节点的树结构中,存在n-1个这样的关系,因此ѭ1被调用了n次(包括初始调用)。在每个调用中,由于迭代,方法本身执行的工作(不包括递归调用)为O(n)。因此,总共为O(n ^ 2)。 通过将所有组放在哈希图中的第一位并遍历列表一次,在哈希图中查找每个父节点,可以将复杂度提高到O(n)。     ,        关于代码的运行时顺序已经有很多讨论,所以我不会对此发表评论。 Aasmund Eldhuset的答案对我来说似乎是正确的。 也许您想要这样的东西,即
O(n)
void AssignChildrenAndParent(IEnumerable<Group> groups)
{

    var groupById=new Dictionary<GroupId,Group>();
    foreach(Group group in groups)
    {
      groupById.Add(group.Id,group);
    }
    foreach(Group group in groups)
    {
       Group parent=groupsById(group.ParentId);
       group.Parent=parent;
       parent.Children.Add(group);
    }
}
这与原始代码的行为有些不同,因为它修复了所有父子关系,而不仅修复了根目录以下的关系。 或者,如果您确实想要行为与原始代码完全一样的代码(如果哈希工作良好,则再次单击O(n)):
private void AddChildren(Group group,IEnumerable<Group> groups)
{
  var children=groups.ToLookup(group=>group.ParentId);
  AddChildren(group,groups,lookup); 
}

private void AddChildren(Group group,IEnumerable<Group> groups,Lookup<GroupId,Group> lookup)
{
    foreach (var g in lookup[group.Id])
    {
       g.Parent = group;
       group.Children.Add(g);
       AddChildren(g,lookup);
    }
}
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。