2017-01-15 4 views
0

Dieser Code speichert Schleifendaten in der Datenbank, aber ich habe Leistungsprobleme, da die Daten so groß sind, spart eine große Anzahl von Datensätzen, und in diesem Fall führt die Rekursion sehr hohe Belastung für den Speicher also brauche ich eine alternative Rekursionslösung, da ich weiß, dass es sich um einen n-stufigen Baum handelt.Wie durchläuft diese Baumstruktur ohne Rekursion C#

private void ProcessLoops(LoopContainer parent, InboundLoop parentLoop) 
    { 
     foreach (var segment in parent.Segments) 
     { 
      if (segment is Loop) 
      { 
       var segmentLoop = segment as Loop; 
       var inboundLoop = new InboundLoop() 
       { 
        Inbound834RegisterId = RegisterId, 
        InboundSTId = InboundST.InboundSTId, 
        LoopName = segmentLoop.Specification.Name, 
        LoopNumber = segmentLoop.Specification.LoopId, 
        Sequence = _loopSequence++ 
       }; 

       if (parentLoop == null) 
       { 
        inboundLoop.InboundLoopId = InboundLoopService.Instance.AddInboundLoop(inboundLoop); 
       } 
       else 
       { 
        inboundLoop.ParentLoopId = parentLoop.InboundLoopId; 
        inboundLoop.InboundLoopId = InboundLoopService.Instance.AddInboundLoop(inboundLoop); 
       } 
       ProcessLoops(segmentLoop, inboundLoop); 
      } 
     } 
    } 

Antwort

0

Jede Rekursion kann als Schleife festgelegt werden.
Für Tiefe Suche können Sie:

  1. die Wurzel in einer Warteschlange gestellt (first in, first out)
  2. Während die Warteschlange herausspringt, stellen Sie alle Kinder des Elements in der Warteschlange
  3. Speicher das Element in der db

Edit: Hinzugefügt Code pro Anfrage

var nodeQueue = new Queue<Node>(); 
nodeQueue.Add(Tree.Root); 
while (!nodeQueue.Empty()) 
{ 
    var item = nodeQueue.Pop(); 
    foreach(Node child in item.Children) 
    { 
     nodeQueue.Add(child); 
    } 
    db.Add(item.Data); 
} 

A nother Weise die mehr Zeit dauern wird, ist die maximale Anzahl der Elemente in dem Baum berechnen (ich nehme an, es nicht ausgeglichen werden kann)

  1. Run in einer Schleife von 0 bis maxitems.
  2. Jede Zahl, in Binär konvertieren.
  3. Verwenden Sie 0 für links und 1 für rechts.
  4. Für jede Ziffer, bewegen Sie sich entsprechend in der Baum. Auf diese Weise stellt jede Zahl einen einzelnen Knoten in Ihrem Baum dar, und Sie können den Baum in einer bestimmten Reihenfolge durchlaufen.

Edit: Hinzugefügt Code pro Anfrage

var length = Tree.Count; 
var depth = Tree.Depth; 
var maxLength = Power(2,depth)-1 
for (var i=0; i<maxLength; i++) 
{ 
    db.Add(Tree.GetByNumber(i)); 
} 

Lassen Sie mich wissen, wenn Sie mehr codierte Antwort wollen (wenn es relevant ist)

+0

Hallo Ori, danke für deine Antwort :), Ich habe versucht, mehrere folgende tiefe erste Algorithmen, aber ich konnte nicht mit der richtigen Struktur kommen, die Ergebnisse sind nicht richtig, so eine codierte Antwort wäre toll :) – GTarek

+0

Erster Teil - Fertig. Zweiter Teil - muss GetByNumber implementieren. Es ist komplizierter und zeitaufwendiger Algorithmus, aber speichert Reihenfolge der Objekte. Brauchen Sie das? –