【发布时间】:2021-08-11 01:15:17
【问题描述】:
想象一下下面的树:
A
/ \
B C
/ \ \
D E F
我正在寻找一种方法来查询例如 F 是否是 A 的后代(注意:F 不需要是 A 的 直接 后代),在这个特定的情况将是真实的。只有有限数量的潜在父节点需要针对更大的潜在后代节点池进行测试。
在测试一个节点是否是潜在父池中某个节点的后代时,需要针对所有潜在父节点进行测试。
这是 a 想出的:
-
将多路树转换为特里树,即为上述树中的每个节点分配以下前缀:
A = 1 B = 11 C = 12 D = 111 E = 112 F = 121 -
然后,为每个可能的前缀大小保留一个位数组并添加要测试的父节点,即如果将 C 添加到潜在的父节点池中,请执行以下操作:
1 2 3 <- Prefix length *[1] [1] ... [2] *[2] ... [3] [3] ... [4] [4] ... ... ... -
当测试一个节点是否是潜在父节点的后代时,取其 trie 前缀,在第一个“前缀数组”(见上文)中查找第一个字符,如果存在,则在第二个“前缀数组”等等,即测试 F 导致:
F = 1 2 1 *[1] [1] ... [2] *[2] ... [3] [3] ... [4] [4] ... ... ...所以是F,是C的后代。
这个测试似乎是最坏情况 O(n),其中 n = 最大前缀长度 = 最大树深度,所以它的最坏情况正好等于直接上树并比较节点的明显方法。但是,如果测试节点位于树的底部附近并且潜在的父节点位于顶部的某个位置,则此方法的性能要好得多。结合这两种算法将减轻两种最坏的情况。但是,内存开销是一个问题。
还有其他方法吗?任何指针都非常感谢!
【问题讨论】:
-
这总是二叉树吗?
标签: algorithm tree trie descendant multiway-tree