【发布时间】:2012-08-29 21:25:06
【问题描述】:
我有一个可能很大的根树结构,我想将其转换为X * Y 矩阵,其中X 是树中的叶子数量,Y 是树中节点的数量,度数更大大于1,即根节点和内部节点。矩阵应该这样填充:
Mi,j = { 0 如果叶 i 有祖先 j,否则为 1
例如,这棵树:
--A
/
1 B
/ \ /
/ 3
/ \
0 C
\
\ --D
\ /
2
\--E
将转化为这个矩阵:
0 1 2 3
A T T F F
B T T F T
C T T F T
D T F T F
E T F T F
由于树可能会变得非常大(可能约为 100,000 片叶子),我想知道是否有比遍历每个叶子节点的树更智能/更快的方法。感觉好像某种算法存在于这个问题的某个地方,但我还没有弄清楚。也许有人可以帮忙?
在我的应用程序中,树代表大phylogenetic hierarchies,所以它不平衡,可能有两个以上的子节点。
【问题讨论】:
-
我认为这里最大的问题是矩阵本身 - 一个微不足道的改进是只存储每个叶子的祖先列表 - 但即使那样你仍然不能更快(至少在big-O 术语)而不是遍历所有祖先,因为无论如何您都必须将它们添加到列表中。您或许应该考虑一下您将如何使用这些数据,以及是否真的需要明确存储所有这些数据,然后可能会出现更好的结果。
-
不幸的是,我必须使用矩阵数据结构,因为在我看不到如何合并祖先列表的进一步步骤中,我需要它作为输入。不过,感谢您指出这一点!
标签: algorithm data-structures tree graph-algorithm