与えられた と の順列についてN
、の番目の順列を辞書順にk
見つける関数があります。また、順列 が与えられた場合、 のすべての順列の中から順列の辞書式インデックスを見つける関数があります。これを行うには、この回答で提案されている「階乗分解」を使用しました。k
N
perm
N
の整数パーティションに対して同じことをしたいと思いますN
。たとえばN=7
、インデックス (左) とパーティション (右) の間を行き来できるようにしたい:
0 ( 7 )
1 ( 6 1 )
2 ( 5 2 )
3 ( 5 1 1 )
4 ( 4 3 )
5 ( 4 2 1 )
6 ( 4 1 1 1 )
7 ( 3 3 1 )
8 ( 3 2 2 )
9 ( 3 2 1 1 )
10 ( 3 1 1 1 1 )
11 ( 2 2 2 1 )
12 ( 2 2 1 1 1 )
13 ( 2 1 1 1 1 1 )
14 ( 1 1 1 1 1 1 1 )
私はいくつかのことを試しました。私が思いついた最高のものは
sum = 0;
for (int i=0; i<length; ++i)
sum += part[i]*i;
return sum;
これにより、次のようになります。
0 0( 7 )
1 1( 6 1 )
2 2( 5 2 )
3 3( 5 1 1 )
3 4( 4 3 )
4 5( 4 2 1 )
6 6( 4 1 1 1 )
5 7( 3 3 1 )
6 8( 3 2 2 )
7 9( 3 2 1 1 )
10 10( 3 1 1 1 1 )
9 11( 2 2 2 1 )
11 12( 2 2 1 1 1 )
15 13( 2 1 1 1 1 1 )
21 14( 1 1 1 1 1 1 1 )
これはうまくいきませんが、正しい軌道に乗っているようです。これを思いついたのは、数字を下に移動する必要がある回数をカウントするためです ( 6,3,2
goes toのように6,3,1,1
)。ただし、物事を再結合する必要がある場合を説明する方法がわからないため、修正方法がわかりません( のよう6,3,1,1
に6,2,2
)。