Estou revisitando um problema antigo em que estava trabalhando há algum tempo.
Um cenário típico é "3 bits são definidos em um número inteiro de 8 bits", ou seja, 00000111.
Todas as combinações exclusivas com 3 bits definidos podem ser facilmente geradas (em ordem) por loops aninhados. O que me interessa é a combinação do índice de mapeamento <->, ou seja, "00001011" seria a segunda combinação (ou o valor "1" em um índice baseado em zero).
Até agora, examinei todas as combinações e as armazenei em uma tabela, tornando o índice de consulta -> conversação uma operação O (1). A outra direção é O (ln (n)) com a busca bissética.
A desvantagem, no entanto, é que isso obviamente pesa muito na memória se aumentarmos o domínio, até um ponto em que isso não seja viável.
Qual seria uma maneira simples de calcular a n.ésima combinação ou o índice de uma dada combinação? A ordem das combinações seria legal, mas não é obrigatória.
fonte
Respostas:
A geração da n-ésima combinação é chamada de algoritmo "sem classificação". Observe que permutações e combinações geralmente podem ser equiparadas pela maneira como o problema é parametrizado. Sem saber exatamente qual é o problema, é difícil recomendar a abordagem exata exata e, de fato, para a maioria dos problemas combinatórios, geralmente existem vários algoritmos diferentes de classificação / desarticulação possíveis.
Um bom recurso é "Algoritmos Combinatórios", de Kreher e Stinson. Este livro tem muitos bons algoritmos de classificação e desclassificação claramente explicados. Existem recursos mais avançados, mas eu recomendaria o Kreher como ponto de partida. Como exemplo de um algoritmo de desclassificação, considere o seguinte:
Isso é desregulamentação da permutação, mas, como mencionado acima, em muitos casos, você pode converter uma desorganização da combinação em um problema de permutação equivalente.
fonte