Я пытаюсь написать код C ++, который будет вычислять все возможные упорядочения групп целых чисел, размеры которых указаны в векторе (длина неизвестна).
Например, если входное значение (group1 = 2, group2 = 3, group3 = 2), тогда мне нужно вычислить каждый порядок первых 7 целых чисел в группах по 2, 3 и 2.
Группы имеют значение во избежание дублирования (т. Е. 1234567 - это то же самое, что и 2134567, что совпадает с 1234576).
Выходные данные должны быть:
1234567
1234657
1234756
1235647
...
6734512
Но можетдать до 10 различных групп (обычно размер группы меньше или равен 5)
Я все еще довольно новичок в C ++, но мне кажется, что мне нужно использовать next_permutation из алгоритма,возможно в рекурсии, но я не смог разобраться в деталях.
Следующее работает (неэффективно) код R, который я написал, (в случае, если мой вопрос был неясен), но он слишком медленныйдля достаточно больших групповых номеров / размеров.
Спасибо!
#Input group sizes for k;
CombnMult<-function(k){
n<-sum(k)
A1<-combn(n,k[1])
CHOOSE<-rep(0,length(k))
CHOOSE[1]<-factorial(n)/(factorial(k[1])*factorial(n-k[1]))
for(i in 1:(length(k)-1)){
CHOOSE[i+1]<-factorial(n-cumsum(k)[i])/(factorial(k[i+1])*factorial(n-cumsum(k)[i+1]))
assign(paste("B",i,sep=''),matrix(get(paste("A",i,sep='')), nrow=cumsum(k)[i]))
if(length((1:n)[is.na(pmatch((1:n),get(paste("B",i,sep=''))[,1]))])>1)
assign(paste("A",i+1,sep=''),apply(get(paste("B",i,sep='')),2,function(z) rbind(matrix(rep(z,CHOOSE[i+1]),ncol=CHOOSE[i+1]),combn((1:n)[is.na(pmatch((1:n),z))],k[i+1]))))
if(length((1:n)[is.na(pmatch((1:n),get(paste("B",i,sep=''))[,1]))])==1)
assign(paste("A",i+1,sep=''),apply(get(paste("B",i,sep='')),2,function(z) rbind(matrix(rep(z,CHOOSE[i+1]),ncol=CHOOSE[i+1]),(1:n)[is.na(pmatch((1:n),z))])))
}
t(get(paste("A",i+1,sep='')))
}
#Example:
CombnMult(c(2,3,2))