2016-10-24 16 views
-1

各部分の最小値と最大値を持つ正確にk個の部分の番号のパーティションを生成するにはどうすればよいですか?例えば最小値と最大値を持つk個の部分の分割

私は最小部分値3と6部と21のすべてのパーティションを選択したいと最大部の値が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] 

の礼儀と私は上記の機能から、私がしたいパーティションを取得するために書いた簡単なのfuctionを昇順

特定の値のすべてのパーティションを生成してループするのではなく、指定した条件を満たすものだけを生成したいと考えています。ここで

+0

なぜあなたは、与えられた境界を持つすべての固定サイズのパーティションを生成しようとしていますか?あなたは計算をスピードアップしようとしていますか?メモリ効率を向上させる?他の何か?最も簡単なアプローチは、パーティションがあなたの基準に合っているが、あなたのニーズを満たしていない場合にのみ生成しなければならない生成コードを変更することです。 – gbe

+0

私は計算を高速化しようとしています。条件に合致するパーティションのみを生成するように生成コードを変更することは、どうやってそれをしたいのかです。私が苦労しているのは、そうするためにaccel_asc関数を変更する方法です。 – L85376

答えて

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] 
+0

ありがとう!私はそれを多く感謝します。 – L85376