【发布时间】: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