2017-01-15 24 views
0

このコードはループデータをデータベースに保存しますが、データが非常に大きいために膨大な数のレコードが保存されるため、パフォーマンスに問題があります。この場合、再帰はメモリだから私はこれがn-aryツリーであることを知っている再帰の代わりの解決策が必要です。このツリー構造を再帰せずにトラバースする方法#

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); 
      } 
     } 
    } 

答えて

0

すべての再帰はループとして設定できます。深検索の
、次のことができますキューを飛び出しながら

  1. は、キュー(先入れ先出し、中)
  2. に根を入れて、あなたは、キュー内のアイテムのすべての子を入れ
  3. 保存DB内の項目

編集:リクエストごとにコードを追加しました

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の方法、は、0からMaxItemsにループで

  1. 実行(私はそれが平衡でないかもしれないと仮定)ツリー内の項目の最大量を算出します。
  2. 各数値は、バイナリに変換します。
  3. 左に0、右に1を使用します。
  4. 各桁につき、 のツリーに従って移動してください。 このように、各数値はツリー内の単一のノードを表し、特定の順序でツリーをループすることができます。

編集:要求

あたりのコードを追加しました
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)); 
} 

こんにちはオリ

+0

(それは、関連するなら)あなたはより多くのコード化された答えをしたい場合は、私に教えてください、あなたの答えの:)のためのおかげで、私はいくつかの次試してみました深い最初のアルゴリズムは、私は正しい構造を思い付くことができなかった、結果は正しくないので、よりコード化された答えは素晴らしいだろう:) – GTarek

+0

最初の部分 - 完了。 2番目の部分 - GetByNumberを実装する必要があります。 これはもっと複雑で時間のかかるアルゴリズムですが、オブジェクトの順序を保存します。 それが必要ですか? –

関連する問題