找出将两个集合划分成n个大小为m的箱子的所有方法,其中必须包括第一个集合(但不是第二个)中的所有项目

2024-04-23 13:42:49 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题的一个特别的例子是,我找到了所有长度s的球员组合,这些球员组合可以放在n球场上(每个球场都有m球员)。你知道吗

然而,还有一个额外的限制:一些球员必须至少在一个球场上。让我们把它们设为“集合”。球场上剩余的名额由“B组”的球员填补。你知道吗

具有所需输出的玩具示例:

Set_A = {0, 1, 2}
Set_B = {3, 4}

def func(set_a, set_b, courts, court_size):
  #insert code here
  return answer

>>>func(Set_A, Set_B, 2, 2)
(((0,1),(2,3)),((0,1),(2,4)),((0,2),(1,3)),((0,2),(1,4)),((0,3),(1,2)),((0,4),(1,2)))

在一个真实的例子中,可能有3个球场,每个球场可容纳4名球员。“A组”有10名选手,“B组”有12名选手。我想找到所有的组合,包括所有10名球员从“集A”和正好2名球员从“集B”。你知道吗

下面的代码(我找到了here)足以在球场上的空格等于“Set A”中球员的数量时找到所有组合,例如通过调用list(partitions(range(12), 4))

def partitions(s, r):
"""
Generate partitions of the iterable `s` into subsets of size `r`.

>>> list(partitions(set(range(4)), 2))
[((0, 1), (2, 3)), ((0, 2), (1, 3)), ((0, 3), (1, 2))]
"""
s = set(s)
assert(len(s) % r == 0)
if len(s) == 0:
    yield ()
    return
first = next(iter(s))
rest = s.difference((first,))
for c in combinations(rest, r - 1):
    first_subset = (first,) + c
    for p in partitions(rest.difference(c), r):
        yield (first_subset,) + p

但是,这对我来说还不够。你知道吗

另一个问题是速度和内存partitions(16,4)'每次运行大约需要14秒,partitions(20,4)'返回一个MemoryError。很可能组合爆炸意味着对于我想处理的某些值来说,它是很难处理的。(然而,我认为大多数情况下这是合理的,特别是如果这些计算被缓存以供以后查找的话)。你知道吗


Tags: restsizereturnheredeflist例子first
1条回答
网友
1楼 · 发布于 2024-04-23 13:42:49

你看错了你的问题,并试图提前优化引导。你知道吗

你不想看到12个位置20个玩家的所有组合。组合不在乎顺序,所以你有两套。A组刚好占据了2个位置,所以你真的只想看到剩下2个位置的12个B组玩家的组合。你知道吗

如果你想看看这些球员在三个球场上的不同表现,在你弄清楚谁会上场之后再做。它仍然不是组合,因为组合不按顺序排列。我也不确定置换是否适用,因为这两个集合很复杂。你知道吗

弄清楚你关心的每个球场的细节级别-如果只是每个球场有四个球员,那么三个球场上的20个球员的案例会给你45个组合(A组+B组中的2组)放到第一个球场,然后是22,275组没有进入第一场的球员看谁进入第二场,谁进入第三场。这基本上给了你150万种不同的可能性谁在每个法院。但是如果你在乎谁和谁对抗,或者谁在球场上的每个位置,那么。。。我所能做的就是祝你好运和晚安。你知道吗

相关问题 更多 >