【问题标题】:Select n items from a set of subsets [closed]从一组子集中选择 n 个项目 [关闭]
【发布时间】:2021-12-30 16:45:11
【问题描述】:

我想知道是否存在可以解决这个问题的算法:

假设你有一个包含集合的集合,其中每个集合可能有元素也可能没有元素,例如,让集合的可能元素是 1,2 和 3,那么我们将有一个像 { {1,2,3}{1}{1,2} ... } 那么,如何选择多个集合,使每个项目都有 n 个元素,例如,让n=200 那么我想要 200 1s、200 2s 和 200 3s 在这个例子中。

【问题讨论】:

  • 你想要确切每个项目的n个元素吗?不保证这是可能的。例如,在您的示例中,您将如何获得 n=2 的解决方案?
  • 您的代码中的SyntaxError ...也可能是列表,但不是集合。内部的东西是列表......但是一个集合不能包含列表,因为它们是可变的。 minimal reproducible example 需要大量澄清。
  • 不要将标签用作愿望清单 - 使用与您显示的代码相关的标签。你的代码甚至不是 python 开始的。
  • 是的,这不是python,是算法问题,我添加python标签只是为了让您知道我想作为响应python相关代码。
  • @PatrickArtner 我认为很明显代码块是概念数据格式的伪代码。我认为他们也指的是数学意义上的“集合”,而不是 Python 的 set。但是,他们确实应该澄清,或者提供有效的 Python 示例(因为他们正在请求 Python 答案)。

标签: python python-3.x algorithm data-structures graph-algorithm


【解决方案1】:

在我深入回答之前,有一些疑问。

假设我们有一个方法 f() 给定一组集合(如您的示例中的那个),它需要找到什么?

如果我们将 n = 3 代入 f(3),它需要找到这样的集合,使得我们每个项目都有 n 个元素(3 个 1s、3 个 2s 和 3 个 3s)?让我们假设这种情况。

那么我们方法的输出应该是满足上一个问题的集合的子集还是我们只需要返回我们的子集中的集合数? 例如 f(3) 在一组集合中如下

[[1,2,3][1][1,2][1,2][1,2,3][3]... ]

我们可以看到一个解决方案子集是[[1,2,3][1,2][1,2,3][3]] 我们可以返回这个子集,或者更确切地说是这个子集中的集合数,即 4。(这可能与算法的空间复杂度有关)。

现在的解决方案,一种朴素的方法可能是这种形式:

  1. 循环遍历这组集合。
  2. 对于单个集合中的每个元素,增加一个元素计数器(例如,集合 [1,2] 将使 1 和 2 计数器各增加一个。
    1. 如果其中一个元素计数大于“n”,则我们不会将该集合纳入我们的解决方案。
    2. 否则,将集合考虑到您的解决方案集中。
    3. 无论如何,请再次调用您的方法,但不要考虑前一组。
    4. 如果您发现每个元素都将计数器增加为“n”,则返回。

伪代码如下所示:

method find_sets(n,sets, sol_sets, element_counters):

    for each set in sets:
        updated_counter = element_counter +  1 for each element in set
        sets = sets.pop(set)

        if for a element in updated_counter > n:
            return method find_sets(n, sets, sol_sets, element_counters)

        else if for any element in updated_counter < n:
            sol_sets.add(set)
            return method find_sets(n, sets, sol_sets, updated_counter)

        else if for every element in updated_counter = n:
            sol_sets.add(set)
            return sol_sets

    # If the solution could not be found
     return None

考虑一组N个集合,最坏的情况是循环每个元素,考虑到这是一个递归算法,我们可以预期时间复杂度为n²。

希望这可以为找到更好的解决方案带来启发。

【讨论】:

  • 太棒了!这对我来说似乎是正确的!感谢您的宝贵时间!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-02
  • 1970-01-01
相关资源
最近更新 更多