【问题标题】:Is there a common algorithm for this set content comparison? What is this called?这个集合内容比较有通用算法吗?这个叫什么?
【发布时间】:2016-08-11 16:47:11
【问题描述】:

我正在用 python 编码。

我有一个集合列表。这些集合包含整数。如果两个集合共享一个整数项,则它是“连接的”。我的目标是确定所有这些集合是否都相互连接到一个组中(而不是没有连接的集合或多组相互连接的集合)。

这有通用的算法吗?这似乎是一个广泛适用的目标。

这是我提出的解决方案:

从第一个集合开始,检查内容是否与任何其他集合共享

删除任何包含共享内容的集合并将其他内容添加到第一个集合

重复直到第一组没有变化

如果所有其他集合都已删除,则它们都已连接

澄清

我想区分一个相互连接的集合链

o--o--o--o--o--o

来自相互连接的不同组

o--o--o o--o--o

因此,仅检查每个集合是否连接到另一个集合是不够的。

【问题讨论】:

  • Python 有 Set 运算符来确定子集。我认为你要求的“算法”是一个“集合覆盖”,它是 NP-Complete
  • @cricket_007 从他的描述来看,我觉得它像是连接的组件,这很容易找到。

标签: algorithm graph set theory


【解决方案1】:

您的解决方案是正确的,并且是 DFS 的一种变体(尽管由于您操纵集合,它可能效率有点低)

你的问题基本上是一个图形问题,graph 是:

G = (V,E)
V = { sets }  = {S1, S2, ..., Sn}
E = { (Si,Sj) | Si and Sj share an integer }

这个图本质上是无向的,你的问题是找出它是否连接。这可以通过BFSDFS 完成。只需从一个任意顶点开始,直到您“卡住”(无需从新源重新开始)。如果发生这种情况时,您已经“发现”了所有集合,则该图是连接的。否则,它不是。

运行时间为O(|V|+|E|),其中|V| 是您拥有的集合数,|E| 是连接数。

注意:通过创建inverted index,可以有效地计算稀疏图的集合E。对于每个数字,创建一个包含该数字的所有集合的列表(这是输入大小的线性),然后通过遍历列表中的所有对来生成边(对于稀疏图,这应该相当小) .
虽然对于稠密图,更有效的生成方法可能就是遍历所有的集合对。

【讨论】:

    【解决方案2】:

    这是我会尝试的:

    • 检查每一组对。
    • 比较每个集合成员:

    • 如果有一个公共整数,则留下一组并继续另一组,继续此操作直到没有更多组。

    • 如果没有任何成员共享,则 break 并输出 false。

    【讨论】:

      【解决方案3】:

      如果可能的整数是已知的,并且它们的数字有一个小的上限,如 32,您可以将每个集合表示为位向量并按位应用 ,如下所示:x(n) = x(n-1) & s(n)s(n)第 n 个集合和& 按位。如果对于任何nx(n) 的所有位都为零,那么您将知道存在多组集合。这种方法的时间复杂度是线性的,并且使用当前硬件可以非常有效地执行的操作。

      可以通过以下检查扩展此解决方案和任何其他解决方案。它必须在原始解决方案之前应用。这个想法是在某些情况下快速完成。检查要求知道每个集合的最小和最大整数。如果所有这些最小整数中的最大整数大于所有最大整数中的最小整数,那么您将知道存在多组集合。因此,在这种情况下,您可以完成。如果条件不成立,您将不得不继续原来的解决方案。

      【讨论】:

        猜你喜欢
        • 2020-06-21
        • 1970-01-01
        • 2015-09-17
        • 2021-08-18
        • 1970-01-01
        • 2015-11-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多