我有一个用来创建无序树的对象(从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 }
将节点放入排序列表或字典中。
扫描该列表,拾取每个节点,在同一列表中找到其父节点(二进制搜索或字典查找),然后将其添加到父节点的Children集合中。
无需堆栈即可将其放入树中。