【问题标题】:Return keys when solving Set Cover problem with a dictionary and the greedy algorithm使用字典和贪心算法解决 Set Cover 问题时的返回键
【发布时间】:2020-11-16 18:28:49
【问题描述】:

我有一个系列封面问题要解决,我希望将系列名称返回给我。我认为存储命名集的好方法是在字典中。 我发现了这个blog,它实现了算法但使用了一个集合列表,我正在尝试修改代码以适应字典。

def set_cover2(universe, subsets):
    """Find a family of subsets that covers the universal set"""
    elements = set(e for s in subsets for e in subsets[s])
    # Check the subsets cover the universe
    if elements != universe:
        return None
    covered = set()
    cover = []
    # Greedily add the subsets with the most uncovered points
    while covered != elements:
        subset = max(subsets.values(), key=lambda s: len(s - covered))
        cover.append(subset)
        covered |= subset

    return cover

这会将集合作为列表返回:

universe = set(range(1, 11))
subsets = {"s1":set([1, 2, 3, 8, 9, 10]),
           "s2":set([1, 2, 3, 4, 5]),
           "s3":set([4, 5, 7]),
           "s4":set([5, 6, 7]),
           "s5":set([6, 7, 8, 9, 10])}


cover = set_cover2(universe, subsets)
print(cover)

[{1, 2, 3, 8, 9, 10}, {4, 5, 7}, {5, 6, 7}]

但不是名字。

要获得名称,我不能使用集合的值来识别名称,因为在我的实际数据中,某些子集可能是相同的(我猜在这种情况下,两者都可以)。无论如何,我想要一个返回每个选定集合名称的解决方案。

我想这必须通过修改subset = max(subsets.values(), key=lambda s: len(s - covered)) 行来实现,但我不确定如何在保留算法集的同时获取从此操作中选择的集的名称。我该怎么做?

期望的输出:

["s1", "s3", "s4"]

【问题讨论】:

    标签: python dictionary set set-cover


    【解决方案1】:

    查看 cmets:

    def set_cover2(universe, subsets):
        """Find a family of subsets that covers the universal set"""
        # cosmetic change: same thing, just looks a bit nicer
        elements = set().union(*subsets.values())
    
        # ... some code here ...
      
        while covered != elements:
            # Use keys, account for this in the key function
            subset = max(subsets.keys(), key=lambda s: len(subsets[s] - covered))
            cover.append(subset)
            # since subset is a key now, change here as well
            covered |= subsets[subset]
    
        return cover
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2021-09-01
      相关资源
      最近更新 更多