【发布时间】: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