【问题标题】:How do I minimally represent the check state of a check tree?我如何最低限度地表示检查树的检查状态?
【发布时间】:2011-08-08 22:52:10
【问题描述】:

如果我有一个树结构,其节点可以有零到多个子节点,每个节点都保存一些数据值以及一个布尔开关,我如何最小化地表示具有特定开关值的节点的这棵树的状态?

例如,假设我的树看起来像这样:

A[0] -> B[1] -> C[1]
        |-----> D[1]
        |-----> E[1]

这里我们有一个检查了 4 个节点的状态,有没有办法以简洁的方式表示这个状态?天真的方法是将四个节点列为被检查的节点,但是如果节点 B 有 100 个子节点而不是只有 4 个呢?

我目前的思路是将每个节点的祖先存储在数据组件中,并根据一组祖先来描述检查状态,以最小化表示状态所需的数据。在下面的树中,节点 N 的祖先表示为 n'。所以上面的树现在看起来像:

A[0, {a}] -> B[1, {a', b}] -> C[1, {a' b' c}]
             |--------------> D[1, {a' b' d}]
             |--------------> E[1, {a' b' e}]

现在您可以分析树并看到节点 A 的所有子节点都已检查,并将状态简单地描述为具有数据元素 a' 的节点设置为 1,或者只是 [a']。如果节点 D 的状态切换为 0,则可以将树状态描述为 [a' not d]。

是否有可用于解决此类问题的数据结构或算法?对更好的方法有任何想法吗?对分析算法有什么想法吗?

谢谢

【问题讨论】:

  • 这个检查树到底是什么?它支持什么样的操作?您是否优化速度或内存占用?如果是速度,哪些是最常用的操作?
  • 检查树是用户选择的节点列表,很像安装新软件时看到的功能树。它将用于表示需要在以后重建的状态,这意味着在构建时间之后不需要插入和删除。内存空闲,速度相对空闲(但想避免O(n^2)),需要优化的是重构校验树状态所需的数据量。因此,如果节点 B 有 100 个子节点并选择了 99 个,我们希望避免使用 99 个数据点来描述这种状态。
  • 你已经有了树形结构,所以你只想为它重建布尔值,对吧?
  • 另外,如果一个节点被选中,它的所有子节点是否都会被自动选中?
  • 是的,没错。我只需要重建布尔状态。是的,设置一个节点的布尔值也会为其子节点设置相同的值。

标签: algorithm data-structures tree computer-science data-modeling


【解决方案1】:

使用从根开始的前序树遍历。如果一个节点被选中,不要遍历它的子节点。对于每个遍历的节点存储它在布尔位图(8 位/字节)中的检查状态(布尔 0/1)。最后使用 zip/bzip 或任何其他压缩技术压缩结果。

当你重构状态时,先解压,然后使用前序树遍历,根据状态设置每个节点,如果状态为checked,则设置所有子节点为checked并跳过它们。

【讨论】:

    【解决方案2】:

    一般来说,没有一种技术能够始终将检查的元素存储在少于 n 位的空间中,其中 n 是树中元素的数量。这背后的基本原理是有 2^n 种不同的可能检查状态,因此您至少需要 2^n 种不同的编码,因此必须至少有一种长度为 2^n 的编码,因为只有 2^n - 1 种编码比这个短。

    鉴于此,如果您真的想尽量减少空间使用,我建议您使用@yi_H 建议的编码。它为每个编码使用精确的 n 位。您可以通过对位应用标准压缩算法来压缩大多数编码,这对于实际的检查节点集可能做得很好,但在最坏的情况下会优雅地降级。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2016-08-26
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      相关资源
      最近更新 更多