【问题标题】:Partitions of k parts with minimum and maximum part values具有最小和最大零件值的 k 个零件的分区
【发布时间】:2016-10-24 18:39:29
【问题描述】:

如何生成恰好有 k 个部分的数字的分区,其中每个部分都有最小值和最大值?

例如,如果我想选择所有 21 个分区,其中 6 个部分,最小部分值为 3,最大部分值为 6,我应该得到以下分区:

[3, 3, 3, 3, 3, 6]     
[3, 3, 3, 3, 4, 5]
[3, 3, 3, 4, 4, 4]

我有以下升序分区代码,由http://jeromekelleher.net/generating-integer-partitions.html提供

def accel_asc(n):
    a = [0 for i in range(n + 1)]
    k = 1
    y = n - 1
    while k != 0:
        x = a[k - 1] + 1
        k -= 1
        while 2 * x <= y:
            a[k] = x
            y -= x
            k += 1
        l = k + 1
        while x <= y:
            a[k] = x
            a[l] = y
            yield a[:k + 2]
            x += 1
            y -= 1
        a[k] = x + y
        y = x + y - 1
        yield a[:k + 1]

我写了一个简单的函数,只从上面的函数中获取我想要的分区:

def eligible_partitions(list_of_partitions, min_value, max_value, k):
     l = []
     for x in list_of_partitions:
          if min(x) >= min_value and max(x) <= max_value and len(x) == k:
               l.append(x)
     return l

不必生成和循环遍历特定值的所有分区,我只想生成满足指定条件的分区。

【问题讨论】:

  • 您为什么要尝试生成所有具有给定边界的固定大小分区?你想加快计算速度吗?提高内存效率?还有别的吗?...最简单的方法是更改​​生成代码,您必须仅在分区符合您的条件时才生成代码,但这可能无法满足您的需求。
  • 我正在尝试加快计算速度。更改生成代码以仅生成符合条件的分区是我想要的方式。我正在努力的是如何修改 accel_asc 函数来做到这一点。

标签: python algorithm number-theory


【解决方案1】:

这是一种方法:

def part(x, n, minval, maxval):
  if not n * minval <= x <= n * maxval:
    return
  elif n == 0:
    yield []
  else:
    for val in range(minval, maxval + 1):
      for p in part(x - val, n - 1, val, maxval):
        yield [val] + p

for p in part(21, 6, 3, 6):
  print p

这会产生:

[3, 3, 3, 3, 3, 6]
[3, 3, 3, 3, 4, 5]
[3, 3, 3, 4, 4, 4]

【讨论】:

  • 谢谢!非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多