algorithm - 高效的分布式算法,用于合并具有公共(public)元素的集合

标签 algorithm scala merge distributed-computing apache-flink

我正在 Flink 上进行 MinHash LSH 的分布式实现,作为最后一步,我需要合并一些集群,这些集群被标识为它们之间相似的元素集。

所以我有一个分布式集合集合作为输入,我需要一种算法来有效地将集合与公共(public)元素合并。鉴于 Flink 的计算模型,该算法可能是迭代的,不一定像 map-reduce。

举个例子:

来自 {{1{1,2}},{2,{2,3}},{3,{4,5},{4{1,27}}}}结果应该是 {1,2,3,27},{4,5} 因为集合 #1、#2 和 #4 至少有一个共同元素。

最佳答案

这是一个想法:Gelly 是 Fl​​ink 的一部分,它有一个连接组件查找器。制作一个图,其中每个集合元素都有一个节点,边以最简单的方式连接每个集合的元素,例如对于 {a, b, c, d, ...} 添加 [a,b], [a,c], [a,d], [a,... 。现在找到连接的组件。他们的节点提供了您正在寻找的集合。

编辑 如果您担心从集合到图形再转换回来的性能影响(尽管这种担心是过早的优化;您应该尝试一下),重新实现 Gelly 的集合 token 推送方案就足够简单了。这是如何工作的。您的示例中已经有了标记:集合编号。让 S[i] 设置为 i 在您的示例中显示。例如。 S[1] = {1,2}。设 R 是一个逆多重图,它将每个集合元素带到它所属的集合集合中。例如。 R[2] = {1,2} 在你的例子中。令 T[i] 为可通过传递非空交集“链接”从集合 i 到达的元素。然后计算:

T[i] = S[i] for all i // with no links at all, a set reaches its own elements
loop
  for all i, Tnew[i] = \union_{ x \in T[i] } S[R[x]]  // add new reachables
  exit if Tnew == T
  T = Tnew
end loop

完成后, map T 的不同值就是您想要的答案。最大迭代次数应为 log |U|其中 U 是集合元素的全域。

关于algorithm - 高效的分布式算法,用于合并具有公共(public)元素的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37486591/

相关文章:

algorithm - 给定高度时间序列,如何计算 "take off"和 "landing"时间?

scala - 对 multipart/form-data 进行 POST 调用时,加特林测试返回 504

Scala getter/setter 作为宏

c - C 中文本文件的合并和排序

algorithm - 动态规划问题中的最优路径

c - 在 c 或 c++ 中具有负值的子集总和

merge - 如何将多个tfrecords文件合并为一个文件?

java - 目录树的递归N路合并/差异算法?

algorithm - 如果在索引 k 处翻转一位的成本现在为 2^k 而不是 1,那么二进制计数器中的摊销分析会发生什么情况?

scala - Spark SQL 嵌套 withColumn