【发布时间】:2011-01-01 09:41:39
【问题描述】:
我正在寻找解决以下问题的有效方法。
列表 1 是由原始三元组标识的记录列表:
X | Y | Z
列表 2 是由三个集合标识的记录列表。一个 Xs,一个 Ys,一个 Zs。 X、Y、Z 与列表一中的“类型”相同,因此可以直接相互比较。
Set(X) | Set(Y) | Set(Z)
对于列表 1 中的项目,我需要找到列表 2 中的所有项目,其中列表 1 中的 X、Y、Z 都出现在列表 2 中的相应集合中。这可以通过一个示例得到最好的证明:
清单1:
X1, Y1, Z1
清单 2:
(X1, X2) | (Y1) | (Z1, Z3)
(X1) | (Y1, Y2) | (Z1, Z2, Z3)
(X3) | (Y1, Y3) | (Z2, Z3)
在上面,列表 1 中的项目将匹配列表 2 中的前两项。第三项将不匹配,因为 X1 没有出现在 X 集中,Z1 没有出现在 Z 集中。
我已经编写了一个功能正确的算法版本,但我担心在更大数据集上的性能。两个列表都非常大,因此迭代列表 1,然后对每个项目执行列表 2 的迭代将非常低效。
我尝试通过将列表 2 中的每个项目反规范化为映射来构建索引,但每个项目的索引中的索引条目数与项目子集的大小成正比。因此,这会使用非常高的内存,并且还需要一些重要的资源来构建。
任何人都可以向我建议解决此问题的最佳方法。我很乐意同时考虑内存和 CPU 的最佳解决方案,但取得平衡会很好!
【问题讨论】:
-
列表 2 的集合中的项目是否有任何排序? (即,这些项目对它们有逻辑顺序吗?)
-
天啊,我被符号弄糊涂了。通常为“|”表示“或”而不是“”,并且 (X1, X2) 表示 2 个元素的元组,而不是 X1 | X2。阅读所有这些东西,我的脑袋都在旋转。
-
每个集合中元素的典型数量是多少?像你的例子中只有几个,还是可以有数百个?
-
你真的应该提供更多细节。清单 1 和清单 2 的大致尺寸是多少?清单 2 中的每个集合中大约有多少个值?这些集合中有什么样的值,整数?列表 2 中的值是否被大量重用,或者它们几乎都是唯一的(只有几个唯一值,数千个唯一值)?
-
@Dav : 这些项目在列表 2 的集合中没有任何排序。
标签: java performance algorithm data-structures scalability