【问题标题】:Parallel algorithm for set intersections集合交点的并行算法
【发布时间】:2012-12-12 18:15:27
【问题描述】:

我有 n 组(分布在 n 列上)表示网格节点的数据,我想知道一种有效的并行算法来找到这些组的交集,即公共节点。只要任何 2 个集合共享一个节点,就会定义一个交集。

例如;

输入:

Rank 0: Set 1 - [0, 1, 2, 3, 4]

Rank 1: Set 2 - [2, 4, 5, 6]

Rank 2: Set 3 - [0, 5, 6, 7, 8]

实现并行算法 --> 结果:(找到交叉点后)

Rank 0: [0, 2, 4]

Rank 1: [2, 4, 5, 6]

Rank 2: [0, 5, 6]

算法需要在 n-ranks 上完成,每个 rank 有 1 个集合。

【问题讨论】:

  • 我发现了一种算法可以有效地进行 2 组交集,因此我正在考虑创建一个树结构,一次比较 2 个等级,直到我用尽所有等级。
  • 2组交集算法是这样的;我们可以有两个索引,它们都从零开始。比较 A 和 B 的两个第一个元素。如果 A[0] 大于 B[0],我们将 B 的索引增加一。如果 B[0] 大于 A[0],我们将 A 的索引增加一。如果它们相等,我们就知道发生了交集,因此将其添加到列表中,并将 A 和 B 的索引加一。一旦任一索引到达 A 或 B 的末尾,我们就找到了 A 和 B 的所有交集。这需要在排序后实现。
  • 从数学上讲,您希望每个等级的结果是该等级集合与其他等级集合的交集的联合。对于并行实现,可能值得考虑一个等效问题:删除不是任何其他集合的元素的每个元素。附:这些集合是否总是有序的(如您的示例中所示)?
  • 是的!我认为在进行交叉操作之前对其进行排序是有帮助的。通过执行排序,我可以消除一些可能没有任何共同元素的等级。您建议的等效问题也有效...让我再考虑一下!

标签: algorithm parallel-processing distributed-computing set set-intersection


【解决方案1】:

您应该能够使用哈希表并行处理这么快的 O(N)。

对于每个集合 S_i,对于每个成员 m_x(所有这些都可以并行完成),将集合成员放入与集合名称关联的哈希表中,例如,.每当你从集合 S_j 在 m_x 的哈希表中命中时,你现在就有了对应的集合编号 S_i,并且你立即知道 S_i 与 S_j 相交。您可以将 m_x 放入派生的交集中。

您需要一个并行安全的哈希表。这很容易;在更新期间锁定存储桶。

[另一个答案建议对集合进行排序。对于大多数排序算法,将是 O(N ln N) 时间,而不是那么快]。

【讨论】:

  • 我想到了这个,但这不会是内存密集型的吗?整个域中的节点数(所有集合的所有条目的总和)可能是数以百万计。将所有集合组装在 1 个等级上并使用优化的串行交叉算法,然后将此信息传达给所有其他等级会更好吗?
  • 你想快点。为了加快速度,您倾向于以时间换取空间。那么,有多少空间呢?估计,一个数据点可能是 16 个字节,一个集合 ID 可能是 4 个字节,一个 hashlink 可能是 8 个字节,所以每个点 32 个字节 * 1 亿 -> 32 亿字节。那是 3.2 Gb 的 RAM,在您当地的计算机经销商处大约 50.00 美元。有什么问题? [您不是已经必须将所有这些数据点保存在内存中吗?]
  • .... 如果您不想要哈希表的额外内存,那么对集合进行排序(为空间付出时间)将是一个很好的解决方案。但是,ln 1 亿是 22(以 2 为底),所以预计它会明显变慢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多