Data structures 如何表示一棵树,其中每个子树可以位于多个父树下

Data structures 如何表示一棵树,其中每个子树可以位于多个父树下,data-structures,methods,tree,Data Structures,Methods,Tree,我正在寻找表示一组结构数据的最佳方法 我正在设计一个产品选择器。它将询问用户一些问题,以缩小到产品集 i、 e 第一个问题:“什么是产品组?” 答:第一组 在第1组中,可用的产品类别为(选择一个): 类别1 类别2 类别4 答:类别4 在组1的类别4中,可用类型为: 类型3 类型5 回答:打字5 对于类别4中的类型5,组1中的可用产品特征为。。。等等 因此,每个新问题都会显示一个列表,该列表不仅基于以前的答案,而且基于以前的所有答案。(即,如果类别4在第2组中,则类别4中的某些可用类型将不同)。

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

我正在设计一个产品选择器。它将询问用户一些问题,以缩小到产品集

i、 e

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

答:第一组

在第1组中,可用的产品类别为(选择一个):
类别1
类别2
类别4

答:类别4

在组1的类别4中,可用类型为:
类型3
类型5

回答:打字5

对于类别4中的类型5,组1中的可用产品特征为。。。等等

因此,每个新问题都会显示一个列表,该列表不仅基于以前的答案,而且基于以前的所有答案。(即,如果类别4在第2组中,则类别4中的某些可用类型将不同)。它就像一棵树,每个孩子都可以在多位家长的带领下

可能有多达10个这样的级别


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

在不了解问题和不同分布的情况下,以下是您应该做的:

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

每个级别中数组的维度将是以前级别的总大小,例如,在类型级别(级别2)中,您将拥有二维数组,维度(#组)*(#类别)

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

如果您使用的语言允许使用指针算术(如c/c++),则可以通过保持所需的偏移量来略微优化矩阵访问,因为它总是以相同的方式开始:[1]、[1][4]、[1][4][5]、…,但这应该在以后很长时间内出现,因为一切都已正常工作


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

组1的类别4中可用的类型与组2的类别4中可用的类型之间的关系是什么?某些产品类型适用于多个类别。只有当某一类型属于某一特定类别(或组)时,才可能存在适用于该类型的其他产品特征。谢谢您的回答。我的问题更多的是关于这种结构的DB存储。另外,我有10个级别,每个级别平均可以有200个项目。对于可能导致200^10=102400000000000000000项的较低级别@卢卡斯:我敢肯定,这并不有趣,但没有额外的信息,你有200^10个以前的选择组合,其中任何一个都可以允许或不允许当前项目,并且你要为每个选择保留最小的1位。然而,确实可以“修剪”其中的一些树,并且由于这会导致大量的0,因此可以使用稀疏矩阵表示来最小化存储的数据量。如果你想把它放在数据库中,我承认这需要额外的思考:)