【问题标题】:Efficient Algorithm for Comparing parts of lists containing sets比较包含集合的列表部分的有效算法
【发布时间】:2015-05-12 07:25:17
【问题描述】:

在我的应用程序中,我需要比较部分集合列表以查看它们是否包含相同的元素。我基本上有以下结构:

List 1 Index   Set
1              (1,5)
2              (3,7)
3              ()
4              (1,9,15)

我有大约 20 个列表,每个列表中有上千套。列表中的 Set 可以为空,也可以包含多达数百个元素。

我需要为列表的不同间隔创建这些集合的并集。 因此,例如,我想将前一个列表的间隔与以下列表进行比较:

List 2 Index    Set
1               (3,6,9)
2               (2)
3               (20)

比较从 2 到 4 的区间列表 1 与从 1 到 2 的区间列表 2 应该得到 (3,9)

目前我使用蛮力方法简单地运行两个列表并比较每个集合。有没有更有效的解决方案?

提前致谢

【问题讨论】:

  • 我不太明白列表与集合之间的关系。每个列表是否只包含一个集合,或者一个列表是否包含零个或多个集合?您的示例建议前者,问题文本建议后者。
  • 如果两个子列表以完全相同的顺序具有完全相同的集合,则它们相等?
  • @stakx,我澄清了我的问题,感谢您的评论
  • 那么,您想返回一个新集合,其中包含可以在列表 1 中的任何集合和列表 2 中的任何集合中找到的所有元素?只需对列表 1 的集合和列表 2 的集合进行并集,然后对这两个集合进行交集。

标签: algorithm data-structures


【解决方案1】:

一种方法是为每个这样的列表创建一个辅助列表,其中包含迄今为止出现在集合中的元素的每个索引中的直方图。

在你的例子中:

List Index     histogram
1              [1=1, 5=1]
2              [1=1, 3=1, 5=1, 7=1]
3              [1=1, 3=1, 5=1, 7=1]
4              [1=2, 3=1, 5=1, 7=1, 9=1, 15=1]

现在,给定两个索引 i,j - 您可以通过获取两个直方图 hist1=list[i-1], hist2=list[j] 创建索引 i,i+1,...,j 中的集合的并集,并返回所有元素 @987654324 @ 这样hist1.get(x) < hist2.get(x),并在不实际迭代列表的情况下获取联合集。

例如,在上面的列表中,如果要查找索引 2,3,4 的并集列表:

hist1=list[1] = [1=1, 5=1]
hist2=list[4] = [1=2, 3=1, 5=1, 7=1, 9=1, 15=1]
hist2-hist1 = [1=2-1, 3=1-0, 5=1-1, 7=1-0, 9=1-0, 15=1-0] = 
            = [1=1, 3=1, 5=0, 7=1, 9=1, 15=1]
union_set = {1,3,7,9,15}

当集合远小于列表时,这种方法特别有用,这似乎是您的情况。

【讨论】:

  • 一个类似的选项,但行为略有不同:在每个列表的顶部创建一个二叉索引树 (BIT),在每个条目中,您存储该段的集合的并集。与此答案中的解决方案相比,所需的存储空间更少,但速度稍慢 - 您必须为长度为 k 的段采用 log(k) 联合。
猜你喜欢
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 2022-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多