如何表示一棵树,每个孩子都可以在多个父母的统治下

时间:2011-09-22 16:32:04

标签: data-structures methods tree

我正在寻找表示一组结构数据的最佳方式。

我正在设计一个产品选择器。它会向用户询问一些问题,以缩小产品范围。

第一个问题:“什么是产品组?”

答案:第1组

在Group1中,可用的产品类别是(选择一个):
组别
产品组别
类别4

答案:Category4

在Group4的Category4中,可用的类型是:
类型3
成的Type5

答案:Type5

对于Type5,在Category4中,在Group1中,可用的Product Chacteristics是......等。

因此,每个新问题都会显示列表,不仅基于之前的答案,还基于之前的所有答案。 (即,如果Category4在Group2中,则类别4中可用的某些类型将不同)。它就像一棵树,每个孩子都可以在多个父母的陪伴下。

最多可能有10个这样的等级。

存储此层次结构的最有效结构是什么?

1 个答案:

答案 0 :(得分:0)

在没有任何关于问题和不同发行版的额外知识的情况下,您应该采取以下措施:

每个节点都有一个存储在其中的n维比特数组,其中n是其级别(组为0级)。然后,当您达到级别i时,您将查看该级别中的所有节点,并且每个节点都会查看适合当前历史记录的位是打开还是关闭。 (节点之间没有指针等,节点只是我正在使用的方便名称。)

每个级别中阵列的尺寸将是先前级别的总大小,例如在类型级别(级别2)中,您将拥有二维数组,其中包含维度(#Groups)*(#Categories)。

例:
要知道Type5是否应该出现在Category4,Group1中,你会在单元格[1] [4]中找到它的数组,如果它在(1)上,那么它应该出现,否则(0)它不应该出现

如果你使用的语言允许指针算术(如c / c ++),你可以通过保持你需要去的偏移来略微优化矩阵访问,因为它始终是相同的:[1],[1] ] [4],[1] [4] [5],......,但这应该在很晚的时候出现,一切都已经正常运作。

如果您稍后了解有关您的问题的更多详细信息,例如大多数这些连接存在或不存在,那么您可以考虑使用稀疏矩阵,例如,而不是常规矩阵。