如何跟踪树遍历的进度?

时间:2012-09-01 08:33:03

标签: python storage tree-traversal

我有一棵树。它有一个平底。我们只对最底层的叶子感兴趣,但这大致是底部有多少叶子......

2 x 1600 x 1600 x 10 x 4 x 1600 x 10 x 4

这是〜13,107,200,000,000叶子?由于尺寸(在每片叶子上进行的计算似乎不太可能优化,只需不到一秒钟)我已经放弃了认为可以访问每一片叶子。

所以我想我会建立一个聪明的'叶子爬行器检查最多"可能"首先是节点(基于它周围的结果)。因此,期望在邻居的分支/组中评估叶子是合理的,但这些组的大小和分布会有所不同。

记录哪些树叶已经访问过但哪些没有访问过的最聪明的方法是什么?

3 个答案:

答案 0 :(得分:1)

您似乎正在寻找一种快速有效(在内存使用方面)的方式来进行会员资格测试。如果是这样,如果你可以应对一些误报,请选择bloom filter

底线是:在您的数据集非常大的情况下使用bloom过滤器您需要的是检查集合中是否存在特定元素 AND < em>假阳性的可能性很小。

应该存在Python的一些实现。

希望这会有所帮助。

答案 1 :(得分:1)

您没有提供大量信息,但我建议您调整搜索算法,以帮助您跟踪所看到的内容。如果你有一个按“可能性”排序的全局方式,你就不会有问题,因为你可以按照可能性的降序访问叶子。但如果我理解你的话,你只是在做一种爬坡,对吧?您可以通过搜索完整的子树来减少存储需求(例如,选择为“可能”的群集中的所有1600 x 10 x 4叶子),并跟踪群集而不是单个叶子。

听起来您的树几何图形是一致的,因此根据您的搜索工作方式,将节点向上合并应该很容易...例如,跟踪其叶子全部已经过检查的1级节点,以及所有节点2级节点的孩子在你的列表中,放下孩子并保留他们的父母。这也许是选择要检查的内容的好方法:如果检查了3级节点中的3个子节点,则第4个节点和最后一个节点也可能值得检查。

最后,一个想法:你真的,非常确定没有办法在小组中排除某些解决方案(不检查每一个解决方案)吗?像数独游戏这样的问题有一个天文数字庞大的搜索空间,但是一个好的蛮力求解器可以消除大块的可能性,而无需检查每个可能的9 x 9板。鉴于您的问题的规模,这将是最实际的攻击方式。

答案 2 :(得分:0)

也许这太明显了,但您可以将结果存储在类似的树中。由于计算速度慢,结果树不应该太快失控。然后查看是否有给定节点的结果。