ツリーを反復処理する再帰的なC#アプリがあり、最後のノードがXに等しい場合は常に、チェーン内のすべてのノードの履歴を維持する必要があります。
たとえば、以下のMATCHという単語を検索しています
Root
|
|-Node1
| |-Sub1
| |-MATCH
|
|-Node2
| |-Node22
| |-Node33
| | |-MATCH
| |-Node3
|
|-Node3
| |-Node88
|-MATCH
Node3がNode2の兄弟であることに注目してください。私の目標は、ルートとMATCHに遭遇するすべてのパスとの間の親子関係を判別することです。これは、次の出力が生成されることを意味します。
Root -> Node1 -> MATCH
Root -> Node2 -> Node33 -> MATCH
Root -> Node2 -> Node3 -> MATCH
Root -> Node3 -> MATCH
これをコーディングするための正しい方法は何ですか?
深いパスまたは長いパスを追跡しようとすると、値のないパスを追跡するためにほとんどのメモリが消費されることがすぐにわかります。値を持つパスは、一致が見つかった上記のパスのみです。
私の目標は、これをAzureテーブルまたはBlobストレージに実装することです... IOクエリごとに100行のバッチで、階層内のレベルごとに最大20,000行がクエリされます。
これは以前に行われたことは確かですが、それが何と呼ばれるかはわかりません。
質問
RAMの消費量を最小限に抑えるために、メモリ内の文字列をどのように参照する必要がありますか?
回答例:
refパラメーターを指定して構造体を使用します...または...
Struct MyMemoryData
{
public string PreviousNode {get;set;}
public string NodeName {get;set;}
}
void MyRecursion(MyMemoryData searchStack, List<string> nodesToQuery)
{
foreach(var str in nodesToQuery)
{
var newToDoList = GetChildNodes(str);
searchStack.PreviousNode = searchStack.CurentNode;
searchStack.CurrentNode = str;
MyRecursion(searchStack, newToDoList);
}
}
または構造体への参照を保存します
Struct MyMemoryData
{
public MyMemoryData PreviousNode {get;set;} // this line was changed: Type is MyMemoryData
public string NodeName {get;set;}
}
void MyRecursion(MyMemoryData searchStack, List<string> nodesToQuery)
{
foreach(var str in nodesToQuery)
{
var newToDoList = GetChildNodes(str);
searchStack.PreviousNode = searchStack; // this line was changed: Saving the object instead of the value
searchStack.CurrentNode = str;
MyRecursion(searchStack, newToDoList);
}
}
または、次のようにすべてをリストに保存します。
void MyRecursion(List<string> searchStack, List<string> nodesToQuery)
{
foreach(var str in nodesToQuery)
{
var newToDoList = GetChildNodes(str);
searchStack.Add(str);
MyRecursion(searchStack, newToDoList);
}
}