当前位置: 首页 > 知识库问答 >
问题:

给定k个分区的Python整数分区

司马腾
2023-03-14

我试图找到或开发Python的整数分区代码。

仅供参考,整数分区将给定的整数n表示为小于n的整数之和。例如,整数5可以表示为41=32=31=221=221=211=11

我已经找到了很多解决方案。http://homepages.ed.ac.uk/jkellehe/partitions.php和http://code.activestate.com/recipes/218332-generator-for-integer-partitions/

然而,我真正想要的是限制分区的数量。

比如,分区k=2的#,一个程序只需要显示5 = 4 1 = 3 2

如果k=3,5=311=221

共有3个答案

李森
2023-03-14

首先我要感谢大家的贡献,我来到这里需要一个生成整数分区的算法,具体如下:

将一个数的分区生成为正好k个部分,但也有最小和最大约束。

因此,我修改了“蛇和咖啡”的代码,以适应这些新的要求:

def partition_min_max(n, k, l, m):
    ''' n is the integer to partition, k is the length of partitions, 
    l is the min partition element size, m is the max partition element size '''
    if k < 1:
        raise StopIteration
    if k == 1:
        if n <= m and n>=l :
            yield (n,)
        raise StopIteration
    for i in range(l,m+1):
        for result in partition_min_max(n-i, k-1, i, m):
            yield result+(i,)



>>> x = list(partition_min_max(20 ,3, 3, 10 ))
>>> print(x)
>>> [(10, 7, 3), (9, 8, 3), (10, 6, 4), (9, 7, 4), (8, 8, 4), (10, 5, 5), (9, 6, 5), (8, 7, 5), (8, 6, 6), (7, 7, 6)]
魏安然
2023-03-14
def part(n, k):
    def _part(n, k, pre):
        if n <= 0:
            return []
        if k == 1:
            if n <= pre:
                return [[n]]
            return []
        ret = []
        for i in range(min(pre, n), 0, -1):
            ret += [[i] + sub for sub in _part(n-i, k-1, i)]
        return ret
    return _part(n, k, n)

例:

>>> part(5, 1)
[[5]]
>>> part(5, 2)
[[4, 1], [3, 2]]
>>> part(5, 3)
[[3, 1, 1], [2, 2, 1]]
>>> part(5, 4)
[[2, 1, 1, 1]]
>>> part(5, 5)
[[1, 1, 1, 1, 1]]
>>> part(6, 3)
[[4, 1, 1], [3, 2, 1], [2, 2, 2]]

使现代化

使用备忘录:

def part(n, k):
    def memoize(f):
        cache = [[[None] * n for j in xrange(k)] for i in xrange(n)]
        def wrapper(n, k, pre):
            if cache[n-1][k-1][pre-1] is None:
                cache[n-1][k-1][pre-1] = f(n, k, pre)
            return cache[n-1][k-1][pre-1]
        return wrapper

    @memoize
    def _part(n, k, pre):
        if n <= 0:
            return []
        if k == 1:
            if n <= pre:
                return [(n,)]
            return []
        ret = []
        for i in xrange(min(pre, n), 0, -1):
            ret += [(i,) + sub for sub in _part(n-i, k-1, i)]
        return ret
    return _part(n, k, n)
周鸿光
2023-03-14

我已经写了一个生成器解决方案

def partitionfunc(n,k,l=1):
    '''n is the integer to partition, k is the length of partitions, l is the min partition element size'''
    if k < 1:
        raise StopIteration
    if k == 1:
        if n >= l:
            yield (n,)
        raise StopIteration
    for i in range(l,n+1):
        for result in partitionfunc(n-i,k-1,i):
            yield (i,)+result

这将生成长度为kn的所有分区,每个分区的顺序从最小到最大。

简单说明一下:通过cProfile,使用生成器方法似乎比使用falsetru的直接方法快得多,后者使用测试函数lambda x,y:list(partitionfunc(x,y))。在n=50,k-5的测试运行中,我的代码运行时间为.019秒,而直接法为2.612秒。

 类似资料:
  • 整数n的划分是将n写成正整数和的一种方式。对于 例如,对于n=7,一个分区是1 1 5。我需要一个程序来查找所有 使用“r”整数对整数“n”进行分区。例如,

  • 问题内容: (重新发布,因为我没有对之前的帖子做出任何回应) 我试图编写一个Python代码以将数字为’n’的弱整数组合(分区)转换为’k’部分,但要使用MINIMUM和MAXIMUM每个分区上的值约束(请参见下面的示例)。同样,必须按字典顺序生成分区。我发现了一些相关的帖子,但无法实现。任何帮助将不胜感激。 范例: n = 5的整数分割区(k = 3): [5,0,0],[4,1,0],[4,0

  • 对于正整数n和k,让“n的k-分区”是k个加起来等于n的不同正整数的有序列表,让给定n的k-分区的“秩”是它在所有这些列表的有序列表中的位置,从0开始。 例如,有两个5(n)的2分区 所以,我想做两件事: 给定n,k和n的k-划分,我想求n的k-划分的秩。 给定n,k和一个秩,我想找到n的k-划分 我能做到这一点,而不必计算n的所有k-划分,在感兴趣的k-划分之前吗? 这个问题与其他问题不同,因为

  • 问题内容: 我试图编写代码来解决标准的整数分区问题(Wikipedia)。我写的代码一团糟。我需要一个优雅的解决方案来解决该问题,因为我想改善自己的编码风格。这不是一个作业问题。 问题答案: 虽然这个答案很好,但我还是建议以下skovorodkin的答案: 如果要所有排列(即(1,3)和(3,1))更改为

  • 在Apache Spark中, -允许将RDD精确划分为分区。 而是如何将给定的RDD划分成分区,使得所有分区(最后一个分区除外)都具有指定数量的元素。鉴于RDD元素的数量是未知的,做<代码>。count()的开销很大。 预期:

  • 问题内容: 说我有一个列表L。如何获得K组所有分区上的迭代器? 示例:L = [2,3,5,7,11,13],K = 3 3组的所有可能分区的列表: ===更新=== 我正在研究一个似乎可行的解决方案,所以我只复制粘贴它即可 输出: 问题答案: 这可行,尽管它可能超级无效(我将它们全部排序以避免重复计算): 它还返回空簇,因此您可能希望将其包装起来以便仅获取非空簇: 计数只是为了检查: 有用 !