【问题标题】:Selecting globally distinct values from multiple set从多个集合中选择全局不同的值
【发布时间】:2016-03-09 20:57:32
【问题描述】:

我有 N 个列表,其中包含不同数量的对象,每个列表都有 X 个所需的不同值。

一个简单的例子:

List1 = [ 1,2,3,4 ] : 2
List2 = [ 2,3,4 ] : 1
List3 = [ 1,2,4 ] : 1

这里的一种解决方案是从 List1 中选择 1 和 2,从 List2 中选择 3,从 List3 中选择 4

但如果问题看起来像这样,就没有解决办法

List1 = [ 1,2,3,4 ] : 2
List2 = [ 2,3,4 ] : 2
List3 = [ 1,2,4 ] : 1

因此,解决此问题的蛮力解决方案是从第一个列表中选择所需数量的对象,然后从第二个列表中选择所需数量的对象,其中所选对象不能在前一个列表中。如果失败,请从第一个列表中选择其他对象,依此类推。

然而,这并不高效,如果有的话,我可能会在找到解决方案之前尝试所有组合。

那么,有没有其他方法可以解决这个问题?

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    这个问题可以用流网络的形式重新表述,并使用多个maximum flow algorithms来解决:

    • 添加源顶点 S
    • 为每个集合添加一个顶点 Gi
    • 从 S 到 G 添加一条边i,其容量等于要选择的项目数
    • 为所有集合的联合中的每个不同数字添加一个顶点Ni
    • 在集合包含数字的每个 Gi 和 Ni 之间添加一条容量为 1 的边
    • 添加汇顶点 T
    • 在每个 Ni 和 T
    • 之间添加一条容量为 1 的边

    您的问题的流网络如下所示:

    如果最大流算法产生的流不等于所需的不同数字的总数,则问题无法解决。否则,使用算法为 Gi 和 Ni 之间的边分配容量来决定要分配哪些数字从每组中取出。

    【讨论】:

    • 很少看到这么好的答案。当我们面带微笑说话时,我正在实施它!
    • @plazm 哇,你在四十分钟内编写了一个最大工作流?这很让人佩服!不客气!
    • 不,作为任何优秀的程序员,我找到了一个已经完成它的库!所以我只使用了那个库并让我的项目建立了网络。你有关于 FordFulkerson 算法的 cmets 吗?
    • @plazm 我认为 Ford-Fulkerson 可以解决你的问题,因为你有积分容量,并且 max flow 的值有一个明确定义的上限。
    • @plazm 是的,你是对的。该算法将终止您的图表。
    猜你喜欢
    • 1970-01-01
    • 2018-09-28
    • 2013-02-02
    • 2012-07-03
    • 1970-01-01
    • 2011-07-24
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多