我有一棵深度为3的树,具有很高的分支因子。让我们说例如第一层包含所有分类学属,第二层包含所有物种,第三层包含有关物种的数据。 或图形化:
genus1 genus2 ... genus70000
/ | \ / | \ / | \
sp1 sp2 sp3 sp4 sp5 sp6 sp330k sp330k+1 sp330k+2
| | | | | | | | |
data1 data2 data3 data4 data5 data6 data330k data330k+1 data330k+2
实际上,每个属平均有大约5种,而不是3种,但它并不重要。我希望以这样的方式存储这些数据,以支持O(1)
中的以下操作(假设每个属中的物种数量不变):
s
g
s
,其属g
,数据为d
我当前的实现存储了属和属于每个属的物种对的列表之间的哈希映射以及与该物种相关的数据。在此方案中,操作2
和3
在O(1)
中运行,但操作1
必须遍历所有属,以便找到包含物种s
的那个。
我想知道什么是更好的数据结构。
修改
在将所需内存加倍时解决此问题很容易。我可以将物种中的单独哈希映射存储到它们的数据中。如果我能在不存储树两次的情况下做到这一点,那就太好了。
P.S。
如果它有任何不同,我在Java7中写作。
答案 0 :(得分:0)
您可以额外HashMap
从s
映射到g
。
答案 1 :(得分:0)
您可以尝试使用3维数据,属和sp的多维数据结构。 例如:kd-Tree,R-tree或PH-Tree。 但不确定这些工作有多好。
PH-tree最适合具有10 ^ 6个条目或更多条目的较大数据集。但它部分地忽略了维度的数量,因为它们在“转置的”64位字符串内部处理。
无论如何,你必须尝试一下。
免责声明:PH-Tree是我自己的数据结构。