【问题标题】:Computing efficiently intersection of n sets有效计算 n 个集合的交集
【发布时间】:2015-02-24 15:41:10
【问题描述】:

我有由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:这是我的做法,不过没有考虑priority,还挺复杂的c=|Set1|+|Set2|, O(c)+O(c * log(c))
  • elementId和priority有什么限制?
  • @Paddy3118: elementId 没有上限,优先级甚至可以限制为 3 个值:{ 1, 2, 3 }

标签: algorithm data-structures time-complexity set-intersection


【解决方案1】:

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

【讨论】:

  • 以这种方式计算每个请求的交集。我想知道我是否可以做一些预计算。
  • @marka.thore 你已经说过你不想预先计算所有可能的交叉点。您当然可以提前将 所有 集合转换为哈希映射。
  • 是的,我不想计算 所有 交叉点,但如果我可以根据优先级预先计算一些东西,那就太好了
  • 在我看来,丢弃最低优先级的元素是错误的。可能我们想要与 10 个集合相交,在第 8 个集合之后,元素a 的最低优先级为 0,但在与集合 9 和 10 相交时,它的优先级会提高到最高。
  • @G.Bach 问题指出,交叉点一次只能在两组之间。如果这不正确,那么是的,需要调整算法。
猜你喜欢
  • 2011-11-26
  • 1970-01-01
  • 2020-12-04
  • 2014-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多