Como calcular a classificação lexicográfica de uma determinada permutação
Por exemplo, existem 6 cadeiras na sala e 4 meninas e 2 meninos. Existem 15 maneiras possíveis possíveis de se sentar nessas cadeiras6!/(4!*2!)=15
.
Meu problema é encontrar uma maneira eficiente de calcular a posição da possibilidade que eles escolhem para sentar. Por posição, quero dizer o seguinte:
BBGGGG - possible position #1
BGBGGG - possible position #2
BGGBGG - possible position #3
BGGGBG - possible position #4
BGGGGB - possible position #5
GBBGGG - possible position #6
GBGBGG - possible position #7
GBGGBG - possible position #8
GBGGGB - possible position #9
GGBBGG - possible position #10
GGBGBG - possible position #11
GGBGGB - possible position #12
GGGBBG - possible position #13
GGGBGB - possible position #14
GGGGBB - possible position #15
Por exemplo, eles escolhem a posiçãoGBBGGG
... Por enquanto, minha solução para calcular o número dessa posição (nº 6) é fazer um loop em todas as posições possíveis e comparar cada uma delas com a ordem selecionada e retornar o número da posição atual, se forem iguais.
Nesse intervalo do exemplo acima, não é grande coisa fazer um loop em 15 combinações possíveis, mas se você aumentar o número de cadeiras e pessoas, esse método está longe de ser eficiente.
Existe alguma fórmula ou maneira mais eficiente que eu possa usar para determinar a posição da possibilidade selecionada? Sinta-se livre para usar qualquer linguagem de programação em seus exemplos.
ATUALIZAR: Eu sei exatamente quantas cadeiras, meninos e meninas estão na sala. O único problema é encontrar o número de posição da possibilidade que eles escolhem para sentar.
A classificação que estou usando no meu exemplo é apenas para melhor legibilidade. Respostas com qualquer tipo de classificação são bem-vindas.