Le moyen le plus efficace de créer un arbre à partir d’une liste de contiguïté

J’ai une liste d’objects de contiguïté (lignes chargées à partir de la firebase database SQL avec la clé et sa clé parent) que je dois utiliser pour créer un arbre non ordonné. C’est garanti de ne pas avoir de cycles.

Cela prend trop de temps (traitement d’environ 3 Ko sur 870 Ko en environ 5 minutes). Courir sur mon poste de travail Core 2 Duo avec beaucoup de RAM.

Des idées sur la façon de rendre cela plus rapide?

public class StampHierarchy { private StampNode _root; private SortedList _keyNodeIndex; // takes a list of nodes and builds a tree // starting at _root private void BuildHierarchy(List nodes) { Stack processor = new Stack(); _keyNodeIndex = new SortedList(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, ssortingng Name, List Children } 

  1. Placez les nœuds dans une liste sortingée ou un dictionnaire.

  2. Parcourez cette liste, sélectionnez chaque nœud, recherchez son nœud parent dans la même liste (recherche binary ou recherche par dictionnaire), ajoutez-la à la collection Children du nœud parent.

Il n’y a pas besoin d’une stack pour mettre cela dans un arbre.

SortedList n’est pas un bon conteneur à utiliser dans ce contexte. C’est O (n) pour les opérations d’insertion (les appels répétés à Add ()), car il est représenté en interne sous la forme d’une liste non hiérarchique. L’utilisation de Dictionary au lieu de SortedList constituera une amélioration importante, car il s’agit du temps d’insertion amorti O (1).