【发布时间】:2013-02-01 08:29:11
【问题描述】:
我正在处理一个 ASP.Net 页面,其中有树视图。在树视图中,一些节点具有嵌套节点,如分支。我的自定义对象列表中有以下格式的数据:
Id、描述、parentId
现在,我正在使用一个函数来递归地将节点添加到树视图中。以下为sn-p代码:
private bool findParentAddNode(string id, string description, string parentid, ref List<CustomTreeNode> treeList)
{
bool isFound = false;
foreach (CustomTreeNode node in treeList)
{
if (node.id == parentid)//if current node is parent node, add in it as its child
{
node.addChild(id, description, parentid);
isFound = true;
break;
}
else if (node.listOfChildNodes != null)//have child nodes
{
isFound = findParentAddNode(id, description, parentid, ref node.listOfChildNodes);
if (isFound)
break;
}
}
return isFound;
}
上述技术效果很好,但是对于超过 30K 的节点,它的性能很慢。请提出一个算法来用循环替换这个递归调用。
【问题讨论】:
-
你确定递归是问题吗?除非你的树形很奇怪,否则不应该有那么多级别。
-
我相信
for loops在 30K 节点下仍然会很慢。如果你不使用相同的参数调用函数,递归方法很好 -
@NadeemJamali Visual Studio 应该包含一个分析器。此外,您可能想查看介绍性 AI / 机器学习教科书,这些教科书很好地涵盖了树搜索算法。 (他们会告诉你,对于递归树搜索,如果你不知道结果应该在树中有多深,那么迭代加深的 DFS 往往比 BFS 具有更好的属性。)
-
看到这篇文章http://stackoverflow.com/q/308816/1174942。我以前用过JetBrains dotTrace。它很棒,但不是免费的。
-
看起来您在整个现有树中扫描您插入的每个节点。这将导致一个 n^2 算法。我建议分两次添加节点:首先创建所有具有 id 和描述的节点并将它们放在地图(哈希表)中。然后再次遍历所有节点,在映射中查找正确的父节点并将该节点附加为子节点。
标签: c# algorithm loops recursion