树过滤性能

时间:2015-08-06 08:20:53

标签: c# algorithm data-structures

目前我的结构如下:

名称,类型,RefName,RefType

目标是用户选择元素和方向,然后在网页(JSON数据)中获取树结构,显示符合其条件的所有元素。你可以想象,上升并不难。树结构变得更窄,因此性能没有问题。虽然越来越多的节点被添加,但在某个时刻它会变慢。此时节点被添加到HashSet中,我递归地通过它们。我的程序结构是:

    private void BuildChildNodes(ElementRefItem element, int goalDepth, int currentDepth =0) 
    {
        if (goalDepth <= currentDepth)
        {
            return;
        }

        currentDepth++;
        var elements = refElementRepository.All().Where(x => x.ElementName == element.Name);
        foreach (var refElement in elements)
        {
            var node = CreateNode(refElement.ElementRefName, refElement.ElementRefType);
            BuildChildNodes(node, goalDepth, currentDepth);
            element.ChildNodes.Add(node);
        }

    }

我正在寻找优化这部分代码的技巧。还有其他方法可以更快地完成这项工作吗?

(实际数据结构有点复杂,但为了清楚起见,显示此版本更容易)

1 个答案:

答案 0 :(得分:0)

每次我检索一次数据(所有数据每天都刷新一次)而不是每次都执行一次查询时,我会构建两个HashSet;一个用于亲子关系,一个用于父母与子女的关系。这使得可以在HashTable中找到一个元素(女巫非常快),从而检索整个树部分。在元代码中,它看起来像这样:

- Create new cache (bottom up, top down)
- Foreach CachedObject
- Check if items exist (both parent and child)
     : yes -> select node
     : no -> create node and insert it in the new cache
 - add child to parent node

这给出了Parent对象的hashset。现在,您可以选择一个父对象,并自动获得整个树部分。