对于排列,给定N
和k
,我有一个函数可以找到按字典顺序k
排列的N
。此外,给定一个 permutation 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
go to 6,3,1,1
)。但是,我不知道如何解决它,因为我不知道如何解释何时必须重新组合(例如6,3,1,1
go to 6,2,2
)。