最有效的方法我有一个递归C#应用程序,遍历一棵树,需要保持链中的所有节点的历史,每当最后一个节点等于X.存储部分共享字符串的集合内存
对于例如,我在下面
Root
|
|-Node1
| |-Sub1
| |-MATCH
|
|-Node2
| |-Node22
| |-Node33
| | |-MATCH
| |-Node3
|
|-Node3
| |-Node88
|-MATCH
通知节点3是怎样一个兄弟到节点搜索词匹配。我的目标是确定遇到MATCH的根和每条路径之间的父子关系。这意味着将生成以下输出:
Root -> Node1 -> MATCH
Root -> Node2 -> Node33 -> MATCH
Root -> Node2 -> Node3 -> MATCH
Root -> Node3 -> MATCH
解决此问题的正确方法是什么?
我立即看到,跟踪深或长路径的任何尝试都会导致大部分内存被用于跟踪没有值的路径。唯一有价值的路径是上面列出的其中找到匹配的地方
我的目标是在Azure表或Blob存储上实现此操作......每IO查询100批次的行,最多查询20,000行在heiarchy每个级别。
我敢肯定,但不知道它会被称为这已经做过..
问题
我应该如何参考字符串在内存中,以便他们消费最少量的RAM?
示例答案:
使用与裁判参数结构......或者......
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);
}
}
或REF保存到结构
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);
}
}
你在问什么?你需要一个递归的方法,沿树走,记住它在树中的位置并返回所有匹配。你在问C#数据结构吗?或者数据库中的数据结构?最有效的方法呢? ...? – Achim
因此,如果Node3在Node2“下”,这样你就可以获得Root-> Node2-> Node3,为什么你不能获得Root-> Node1-> Node2-> Node33或Root-> Node1-> Node2-> Node3 ?由于Node3不是Node2的子节点,所以在这种情况下“under”的意思并不清楚,它是兄弟节点。 –
@MattBurland我不是想要计算兄弟姐妹,只是父母的孩子关系。我仔细检查了我的例子,我认为它是正确的。 – LamonteCristo