Algorithm 如何最低限度地表示检查树的检查状态?

Algorithm 如何最低限度地表示检查树的检查状态?,algorithm,data-structures,tree,computer-science,data-modeling,Algorithm,Data Structures,Tree,Computer Science,Data Modeling,如果我有一个树结构,它的节点可以有零到多个子节点,每个节点都有一些数据值和一个布尔开关,那么如何为具有特定开关值的节点最小地表示这棵树的状态 例如,假设我的树看起来像: A[0] -> B[1] -> C[1] |-----> D[1] |-----> E[1] A[0, {a}] -> B[1, {a', b}] -> C[1, {a' b' c}] |--------------> D[1,

如果我有一个树结构,它的节点可以有零到多个子节点,每个节点都有一些数据值和一个布尔开关,那么如何为具有特定开关值的节点最小地表示这棵树的状态

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

A[0] -> B[1] -> C[1]
        |-----> D[1]
        |-----> E[1]
A[0, {a}] -> B[1, {a', b}] -> C[1, {a' b' c}]
             |--------------> D[1, {a' b' d}]
             |--------------> E[1, {a' b' e}]
这里我们有一个检查了4个节点的状态,有没有一种方法可以简洁地表示这个状态?天真的方法是将四个节点列为要检查的节点,但是如果节点B有100个子节点而不是只有四个子节点,该怎么办

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

A[0] -> B[1] -> C[1]
        |-----> D[1]
        |-----> E[1]
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'而不是D]

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


谢谢

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


重建状态时,首先解压缩,然后使用前序树遍历,根据状态设置每个节点,如果选中状态,则将所有子节点设置为选中并跳过它们。

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

有鉴于此,如果您真的想最小化空间使用,我建议使用@yiu_H建议的编码。它精确地为每个编码使用n位。通过对比特应用标准的压缩算法,您可能能够压缩大多数编码,对于实际的检查节点集,这可能会做得很好,但在最坏的情况下,它会优雅地退化


希望这有帮助

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