Algorithm 高效计算n个集合的交集

Algorithm 高效计算n个集合的交集,algorithm,data-structures,time-complexity,set-intersection,Algorithm,Data Structures,Time Complexity,Set Intersection,我有由setId标识的n集合,每个集合可以包含任意数量的元素,它们是一对(elementId,priority) 我的算法应该接受两个输入setId,并在输出中给出一个包含第一个m元素的集合,该元素位于两个输入集合的交点处,具有最高优先级(优先级之和) 例如: n=3, m=1 Set1: { (1, 1), (12, 2) } Set2: { (1, 4), (23, 6), (33, 22) } Set3: { (33, 1), (1, 16 } Input: Set2, Set3 O

我有由
setId
标识的
n
集合,每个集合可以包含任意数量的元素,它们是一对
(elementId,priority)

我的算法应该接受两个输入
setId
,并在输出中给出一个包含第一个
m
元素的集合,该元素位于两个输入集合的交点处,具有最高优先级(优先级之和)

例如:

n=3, m=1

Set1: { (1, 1), (12, 2) }
Set2: { (1, 4), (23, 6), (33, 22) }
Set3: { (33, 1), (1, 16 }


Input: Set2, Set3
Output: { (33, 23) }
我的问题是:假设我有无限的空间,为了优化性能,我可以使用什么样的最佳数据结构

当然,预先计算所有可能的交叉口并不是一个有效的答案

编辑

实际数字:

  • n
    ,设置编号,是
    ~10^6
  • 集合的平均基数为
    ~5*10^3

取其中一套,将其转换为一套。迭代另一个集合,并为每个成员尝试在哈希映射中查找元素。如果您找到它,将结果添加到;如果堆的大小增加到一个大于您希望保留的元素数,请丢弃堆中最低的项。

给我们一个实际的集合和集合元素数。以玩具为例,这是毫无意义的。你所说的“优先级总和”是什么意思?没有道理。您有一组元组。按elementId排序,然后同时遍历这两个集合,并在输入匹配时添加到输出集合中(如果您明白我的意思的话)@Skizz:这是我的方法,但它没有考虑到
优先级
,而且非常复杂
c=| Set1 |+| Set2 |,O(c)+O(c*log(c))
elementId和优先级的限制是什么?@Paddy3118:
elementId
没有上限,优先级甚至可以被限制为3个值:
{1,2,3}
这样我计算每个请求的交集。我想知道我是否可以做一些预计算。@marka.thore你已经说过你不想预计算所有可能的交叉口。您当然可以提前将所有集合转换为哈希映射。是的,我不想计算所有交点,但如果我可以根据优先级预先计算某个集合,那将是非常棒的。在我看来,放弃最低优先级的元素是错误的。可能我们想要相交10组,在第8组之后,元素
a
的优先级最低为0,但在与第9组和第10组相交时,其优先级会被提升到顶部。@G.Bach问题表明,一次相交将仅在2组之间。如果这是错误的,那么是的,算法需要调整。