Tôi có một danh sách kề các đối tượng (các hàng được nạp từ cơ sở dữ liệu SQL với khóa và khóa chính) mà tôi cần sử dụng để xây dựng một cây không theo thứ tự. Nó được đảm bảo không có chu kỳ.Cách hiệu quả nhất để tạo cây từ danh sách kề
Quá trình này mất quá nhiều thời gian (chỉ xử lý ~ 3K trong số 870K nút trong khoảng 5 phút). Chạy trên máy trạm Core 2 Duo của tôi với nhiều RAM.
Bất kỳ ý tưởng nào về cách thực hiện điều này nhanh hơn?
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
}
Bạn có chắc chắn phải làm điều này trong C# không? Bởi vì nó sẽ nhanh hơn rất nhiều để sắp xếp các nút theo đường dẫn trong SQL, sau đó bạn có thể xây dựng một cây trong thời gian O (N). – Aaronaught
Tôi có thể đặt hàng bằng đường dẫn trong SQL bằng cách nào? Dữ liệu của tôi giống như một biểu đồ org ... rất nhiều trẻ em và rất nhiều cấp độ rách rưới. –