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
优先级
,而且非常复杂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组之间。如果这是错误的,那么是的,算法需要调整。