【发布时间】:2012-08-27 16:58:01
【问题描述】:
我有一个存储过程,它返回按树组织的名称的平面列表。为了传达谁是有深度值的父级,因此 5 条记录(最多 3 级)的结果如下所示:
Depth|Name
----------
0|Ford
1|Compact Cars
2|Pinto
1|Trucks
2|H-Series
我试图通过读取深度值从这个数组中构造一棵树。有没有一些明显的算法可以从这样的数据序列中构造一棵树?我添加 C# 标记是因为我愿意接受 LINQy 解决此问题的方法,尽管通用的计算机科学答案会非常有帮助。
这是我目前的尝试:
class Record
{
public string Name{ get; set; }
public List<Record> children { get; set; }
}
var previousLevel = 0;
var records = new List<Record>();
foreach (var thing in TreeFactory.fetch(dao))
{
if(this.Depth == 0) {
//Root node
} else if(thing.Depth > previousLevel) {
//A Child of the last added node
} else if(thing.Depth < previousLevel) {
//A Cousin of the last added node
} else {
//A Sibling of the of the last added node
}
previousLevel = this.Depth;
}
我所说的“高效”是指最多包含 200,000 个元素的列表大小和最多可扩展到 100 个级别的树,所以实际上我只是在寻找更容易推理的东西。
【问题讨论】:
-
我当前的代码以一个简单的 List
开头,其中 Record 包含一个名为 Children 的 List 。然后我保留先前深度的副本并进行测试。如果新的深度等于前一个它是兄弟,如果它大于则 ti 是一个孩子,如果它小于它是最近添加的父级的兄弟。我说“尝试”是因为代码变得相当混乱。 -
投反对票是因为问题的模糊性还是以福特汽车为例?
-
我猜 Pinto 从来没有经历过他们过去容易着火的时期。
-
当您说您需要一个高效的解决方案时,您的数据集有多大?您是否真的有数十万个项目要添加,或者数千个类似的列表要填充,还是您只是因为“效率总是好的”而这么说。