【发布时间】: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