【发布时间】:2011-02-08 22:10:06
【问题描述】:
我有一个需要用来构建无序树的对象的邻接列表(从 SQL 数据库加载的行,带有键和它的父键)。保证没有循环。
这花费的时间太长(大约 5 分钟内处理了 870K 节点中的约 3K)。在具有大量 RAM 的工作站 Core 2 Duo 上运行。
关于如何使这更快的任何想法?
public class StampHierarchy {
private StampNode _root;
private SortedList<int, StampNode> _keyNodeIndex;
// takes a list of nodes and builds a tree
// starting at _root
private void BuildHierarchy(List<StampNode> nodes)
{
Stack<StampNode> processor = new Stack<StampNode>();
_keyNodeIndex = new SortedList<int, StampNode>(nodes.Count);
// find the root
_root = nodes.Find(n => n.Parent == 0);
// find children...
processor.Push(_root);
while (processor.Count != 0)
{
StampNode current = processor.Pop();
// keep a direct link to the node via the key
_keyNodeIndex.Add(current.Key, current);
// add children
current.Children.AddRange(nodes.Where(n => n.Parent == current.Key));
// queue the children
foreach (StampNode child in current.Children)
{
processor.Push(child);
nodes.Remove(child); // thought this might help the Where above
}
}
}
}
public class StampNode {
// properties: int Key, int Parent, string Name, List<StampNode> Children
}
【问题讨论】:
-
您是否必须在 C# 中执行此操作?因为在 SQL 中按路径对节点进行排序会快得多,然后您可以在 O(N) 时间内构建一棵树。
-
如何在 SQL 中按路径排序?我的数据就像一个组织结构图......很多孩子和很多参差不齐的级别。
标签: c# algorithm adjacency-list