我试图通过例子来解释:
想象一个编号元素的列表 E = [elem0, elem1, elem2, ...]。
一个索引集现在可以是 {42, 66, 128} 引用 E 中的元素。这个集合中的顺序并不重要,所以 {42, 66, 128} == {66, 128, 42},但每个元素都是在任何给定的索引集中最多一次(所以它是一个实际的集合)。
我现在想要的是一个节省空间的数据结构,它给了我另一个有序列表 M,其中包含引用 E 中元素的索引集。 M 中的每个索引集只会出现一次(因此 M 在这方面是一个集合)但 M 必须本身是可索引的(所以 M 在这个意义上是一个 List ,因此精确的索引并不重要)。如有必要,可以强制索引集包含相同数量的元素。
例如,M 可能看起来像:
0: {42, 66, 128}
1: {42, 66, 9999}
2: {1, 66, 9999}
我现在可以执行以下操作:
for(i in M[2]) { element = E[i]; /* do something with E[1],E[66],and E[9999] */ }
您可能会看到这是怎么回事:您现在可能有另一个映射 M2,它是指向 M 的有序集合列表,最终指向 E 中的元素。
正如您在此示例中所见,索引集可能相对相似(M[0] 和 M[1] 共享前两个条目,M[1] 和 M[2] 共享后两个)这让我认为必须比使用集合数组的天真方式更有效。但是,我可能无法提出保证良好“共享”的索引条目的良好全局排序。
我可以想到任何东西,从将 M 表示为一棵树(其中 M 的索引来自深度优先搜索排序或其他东西)到联合查找结构的哈希映射(虽然不知道它是如何工作的:)
非常欢迎指向任何此类教科书数据结构的指针(数据库世界中有什么吗?)但如果您提出“自制”解决方案或仅提出随机想法,我也很感激。
空间效率对我来说很重要,因为 E 可能包含数千甚至几百万个元素,(一些)索引集可能很大,至少一些索引集之间的相似性应该很大,并且可能存在多层映射。
万分感谢!