集合集合中是否有明显的价值

时间:2012-09-02 19:51:45

标签: algorithm set

我有N组值,例如

  • S1 = {A,B,C,D,E}
  • S2 = {A,B,C,D,E,F}
  • S3 = {A,B}
  • S4 = {C,E,F,G,H}

我希望知道每个集合中是否有独特或独特的价值......即。是否存在通过集合的“路径”,在每个集合中至少留下一个值,而不是任何其他值。 以上示例的答案将为TRUE,因为您可以: 来自S1的B,来自S2的D,来自S3的A和来自S4的C

一个假的例子是:

  • S1 = {A,B,C}
  • S2 = {A}
  • S3 = {A,B}
  • S4 = {A,C}

因为价值需要在集合之间重复。

与往常一样,我确信必须有一个简单的解决方案来解决这个问题。非常感谢任何帮助。谢谢

澄清

到目前为止,感谢您的答案,但我仍然对此感到有些困惑,尽管有(我认为)简单要求。我怀疑我让问题听起来比它实际代表的问题更令人困惑。

澄清一下,我的最终目标是:

  • 每组都有一个值。
  • 此新值列表应彼此不同。
  • 从每组中挑选的价值相对较低。
  • 如果无法从输入集中派生单个不同的值,则该过程应该不返回任何内容

我已经阅读了关于Bipartite图和最大流量的内容但是我不能完全看到“来自树木的木材”最终我需要在.NET中编写一些代码来实现这一点,所以一些伪代码将是一个非常大的帮助,如果那不可能仅仅是一个更简单的相关算法的例子将是伟大的。

3 个答案:

答案 0 :(得分:3)

使用;

创建二分图
Set X containing value of nodes = {S1,S2,S3,...,SN}
Set Y containing value of nodes = {A,B,C...}

通过根据问题中给出的集合制作边缘,将此图表与问题陈述匹配。

问题在于检查X和Y之间的“最大值(二分)匹配”是否等于N.如果需要知道值的赋值,则也打印此匹配。 / p>

编辑(更多解释)

enter image description here

两组之间的边缘表示原始集合。我们需要找到边缘,使得X中的所有顶点都被覆盖,并且没有2条边共享一个公共顶点

注意:可能存在多个最大匹配

答案 1 :(得分:1)

认为你的要求是:

调用集S1S2,...,Sn。调用元素a1a2,...,am。然后你想:

  • 为每个S选择 a成员S,以便至少有一个其他S执行包含a

所以在你的例子中:

  • S1 选择 BS4缺席
  • S2 选择 DS3缺席
  • S3 选择 AS4缺席
  • S4 选择 CS3缺席

要解决此问题,可能的方法是:

  • 遍历S和成员a,跟踪所见的所有不同a以及它们出现的S个数量的计数
  • 再次遍历S,并为每个人查看计数小于a的成员n的构建计数列表,{{1}的总数}}秒。 选择符合此要求的任意S

我们已经完成了。


您的评论似乎还有一个额外要求“如果'A'存在于多个集合中,则'A'应保留在其中一个集合中”,

  • 对于属于多个a成员的每个aS是某些a的“已挑选”成员

但是,我看不出如何对您的评论进行评论,因为在您的示例中,S存在于多个E中,但从不<强>拾取

答案 2 :(得分:0)

让我们以表格的形式表示您的第一个示例中的数据:

    a   b   c   d   e   f   g   h
s1  .   .   .   .   .
s2  .   .   .   .   .   .
s3  .   .
s4          .       .   .   .   .

现在,我们正在寻找一些解决方案,例如这个解决方案(取自问题):

s1=b, s2=d, s3=a, s4=c

标记的解决方案(一列中不能有两个X):

    a   b   c   d   e   f   g   h
s1  .   X   .   .   .
s2  .   .   .   X   .   .
s3  X   .
s4          X       .   .   .   .

类似于在Assignment problem ...

中为处理器选择任务

但如果你不关心复杂性,那么检查所有可能的配置怎么样?

for (every element in s1) as e1
    for (every element in s2) as e2
        for (every element in s3) as e3
            for (every element in s4) as e4
                if (e1 != e2 != e3 != e4)
                    return true;
return false;

复杂的O(s1.length * s2.length * s3.length * s4.length)是琐碎的蛮力。