【问题标题】:How to track the progress of a tree traversal?如何跟踪树遍历的进度?
【发布时间】:2012-09-01 08:33:02
【问题描述】:

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

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

那是 ~13,107,200,000,000 片叶子?由于大小(在每个叶子上执行的计算似乎不太可能优化到不到一秒),我已经放弃了访问每个叶子的想法。

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

记录哪些叶子被访问过和哪些没有被访问过的最聪明的方法是什么?

【问题讨论】:

    标签: python storage tree-traversal


    【解决方案1】:

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

    听起来您的树几何结构是一致的,因此根据您的搜索工作方式,向上合并节点应该很容易......例如,跟踪已检查所有叶子的级别 1 节点,以及何时2 级节点的子节点在您的列表中,删除子节点并保留其父节点。这也可能是一个选择检查内容的好方法:如果已经检查了 3 级节点的三个子节点,那么第四个也是最后一个节点可能也值得检查。

    最后,一个想法:你真的,真的确定没有办法在组中排除一些解决方案(不检查每个单独的解决方案)吗?像数独这样的问题有一个天文数字般大的搜索空间,但是一个好的蛮力求解器会消除大量的可能性,而不需要检查每一个可能的 9 x 9 棋盘。鉴于您的问题的规模,这将是解决问题的最实用方法。

    【讨论】:

      【解决方案2】:

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

      底线是:在您的数据集非常大的情况下使用布隆过滤器并且您所需要的只是检查集合中是否存在特定元素 AND 误报的可能性很小是可以容忍的。

      应该存在一些 Python 实现。

      希望这会有所帮助。

      【讨论】:

        【解决方案3】:

        也许这太明显了,但您可以将结果存储在类似的树中。由于您的计算速度很慢,因此结果树不应过快增长。如果您有给定节点的结果,则只需查找。

        【讨论】:

        • 根据我的计算,即使我确实设计了一种方法将其降低到每片叶子一位,我也需要 1.5 TeraBytes 的存储空间。
        • @JohnMee 你要处理多少片叶子?我的想法是结果树只包含结果,而不为丢失的结果分配任何空间。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多