【发布时间】:2013-01-06 17:32:48
【问题描述】:
我试图举例说明:
想象一个编号元素的列表 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 可能包含数千甚至几百万个元素,(某些)索引集可能很大,至少一些索引集之间的相似性应该很大,并且可能存在多层映射。
非常感谢!
【问题讨论】:
-
信息太多。我无法理解 M 是如何生成的。请解释 1 和 9999 是从哪里拍摄的?
-
这只是一个例子,数字并不重要。 M 的条目 2 = {1, 66, 9999} 仅引用元素 E[1]、E[66]、E[9999]。如果你需要一些具体的东西,想想 E 包含你的 10.000 个 facebook 朋友,M[2] 包含所有在 3 月结识的朋友的索引(0=1 月,1=2 月,2=3 月)。
-
对我来说再次不是很清楚。 E 是指定用户的好友还是它的全局用户列表? M[X] 是“在 X 中结识的朋友”,请更好地澄清这部分,因为我不明白为什么会有重复,因为我理解这是一个主要问题,需要对其进行优化。这些用户的所有组合都与指定用户结为好友或结为好友?