如何在java中将字符串元素拆分为不相交的组?

时间:2017-03-29 23:31:58

标签: java algorithm data-structures bigdata

这些行如下

A1;B1;C1
A2;B2;C2

如何找到一组唯一字符串并按以下标准将其分为非相交组:如果两行在一列或多列中具有非空值的重合,则它们属于同一组。例如,行

1,2,3
4,5,6
1,5,7

属于一个群组。 最初我想通过三个HashSet(对于每一列)快速查看字符串是否包含在唯一值列表中,然后将其添加到已分组行的列表或唯一行列表中。但是这种情况下的算法存在性能瓶颈:如果要合并组,则必须遍历列表中的每个组。具有大量合并的大量数据(> 100万条记录)的算法工作缓慢。如果合并很小(大约数千),它会很快运作。我抓住了这个地方的卡住,不知道如何优化这个瓶颈,或者是否有必要使用其他数据结构和算法。有人能告诉我挖掘的方向。对于此事的任何想法,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

我建议采用以下方法:

  • 创建一个Set<String> ungroupedLines,最初包含所有行。在您将这些行分配给组时,您将删除这些行。
  • 按照您的建议构建三个Map<String, Collection<String>> - s,每列一个。
  • 初始化空Collection<Collection<String>> result
  • 虽然ungroupedLines不为空:
    • 创建新的Collection<String> group
    • 删除元素,将其添加到group
    • 执行&#34;深度优先搜索&#34;从该元素,使用您的三个地图。
      • 忽略(跳过)已从ungroupedLines
      • 中删除的所有元素
      • 对于其他内容,请将其从ungroupedLines中删除,然后将其添加到group,然后再进行递归。
      • 或者,您可以使用广度优先搜索。
    • group添加到result