从邻接表创建树的最有效方法

我有一个用来创建无序树的对象(从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

}

回答:

  1. 将节点放入排序列表或字典中。

  2. 扫描该列表,拾取每个节点,在同一列表中找到其父节点(二进制搜索或字典查找),然后将其添加到父节点的Children集合中。

无需堆栈即可将其放入树中。

以上是 从邻接表创建树的最有效方法 的全部内容, 来源链接: utcz.com/qa/415464.html

回到顶部