【发布时间】:2011-12-30 00:47:21
【问题描述】:
我正在寻找我一直在研究的深度搜索算法的替代方案。我的代码有点长,无法在此处发布,但我已经编写了一个简化版本来捕获重要方面。首先,我创建了一个名为“BranchNode”的对象,该对象包含一些值以及一组其他“BranchNode”对象。
class BranchNode : IComparable<BranchNode>
{
public BranchNode(int depth, int parentValue, Random rnd)
{
_nodeDelta = rnd.Next(-100, 100);
_depth = depth + 1;
leafValue = parentValue + _nodeDelta;
if (depth < 10)
{
int children = rnd.Next(1, 10);
branchNodes = new BranchNode[children];
for (int i = 0; i < children; i++)
{
branchNodes[i] = new BranchNode(_depth, leafValue, rnd);
}
}
}
public int CompareTo(BranchNode other)
{
return other.leafValue.CompareTo(this.leafValue);
}
private int _nodeDelta;
public BranchNode[] branchNodes;
private int _depth;
public int leafValue;
}
在我的实际程序中,我从其他地方获取数据……但对于这个示例,我只是将一个 Random 对象的实例传递到我用来为每个 BranchNode 生成值的行中。 .. 我还手动创建了 10 的深度,而我的实际数据将有任意数量的代。
作为对我的目标的快速解释,_nodeDelta 包含一个分配给每个 BranchNode 的值。每个实例还维护一个叶子值,它等于当前 BranchNode 的 _nodeDelta 与它所有祖先的 _nodeDelta 之和。我正在尝试找到没有子节点的 BranchNode 的最大叶子值。
目前,我正在递归遍历层次结构,搜索其子 BranchNodes 数组为空的 BranchNodes(又名:“无子”BranchNode),然后将其叶值与当前最高叶值的叶值进行比较。如果它更大,它将成为基准并继续搜索,直到它查看所有 BranchNode。
如果有帮助,我可以发布我的递归搜索算法,但它非常标准,并且运行良好。正如预期的那样,我的问题是,对于较大的层次结构,我的算法需要很长时间才能遍历整个结构。
我想知道我是否有任何其他可以研究的选项可能会产生更快的结果...具体来说,我一直在尝试围绕 linq,但我什至不确定它是否已构建做我正在寻找的东西,或者如果它会更快。还有其他我应该调查的事情吗?
【问题讨论】:
-
所有递归算法都可以使用循环展开和完成。
-
虽然在这种情况下,Linq 可能不是该任务的正确工具,但如果你真的愿意,可以express recursion in Linq。
-
数据实际上是一个对象层次结构还是您将数据作为 xml... 或者您如何获取数据?
-
提高对大型数据集的查询的搜索时间的标准方法是构建另一个称为“索引”的数据结构,可以快速搜索。谷歌和必应实际上不会在几毫秒内搜索整个互联网;他们在几毫秒内搜索整个互联网的索引。我给你的建议:建立一个索引;搜索它。
-
您是否可以从对象中引用 BranchNode 的父节点,还是只维护子节点数组?如果你能穿越两个方向,我可能会有一些想法。