J'ai une liste d'adjacences d'objets (lignes chargées depuis la base de données SQL avec la clé et sa clé parent) que je dois utiliser pour construire une arborescence non ordonnée. C'est garanti de ne pas avoir de cycles.Méthode la plus efficace pour créer une arborescence à partir d'une liste d'adjacences
Cela prend wayyy trop longtemps (traité seulement ~ 3K sur 870K nœuds en environ 5 minutes). En cours d'exécution sur mon poste de travail Core 2 Duo avec beaucoup de RAM.
Des idées sur la façon d'accélérer les choses?
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
}
Avez-vous absolument à faire cela en C#? Parce que ça va être beaucoup plus rapide de commander les nœuds par chemin en SQL, avec lequel vous pouvez ensuite construire un arbre en O (N). – Aaronaught
comment puis-je commander par chemin en SQL? Mes données sont comme une organigramme ... beaucoup d'enfants et beaucoup de niveaux déchiquetés. –