Estoy revisando un viejo problema en el que estaba trabajando hace algún tiempo.
Un escenario típico es "3 bits se establecen dentro de un entero de 8 bits", es decir, 00000111.
Todas las combinaciones únicas con 3 bits establecidos se pueden generar fácilmente (en orden) mediante bucles anidados. Lo que me interesa es la combinación de índice de mapeo <->, es decir, "00001011" sería la segunda combinación (o valor "1" en un índice basado en cero).
Hasta ahora, revisé todas las combinaciones y las almacené en una tabla, haciendo que el índice de búsqueda -> conversación sea una operación O (1). La otra dirección es O (ln (n)) con búsqueda bisecta.
La desventaja, sin embargo, es que esto obviamente es pesado en la memoria si aumentamos el dominio, hasta un punto donde no es factible.
¿Cuál sería una manera simple de calcular la combinación n.th o el índice para una combinación dada? El orden de las combinaciones sería bueno, pero no es obligatorio.
Respuestas:
La generación de la enésima combinación se denomina algoritmo "sin clasificación". Tenga en cuenta que las permutaciones y combinaciones a menudo pueden equipararse por la forma en que se parametriza el problema. Sin saber exactamente cuál es el problema, es difícil recomendar el enfoque correcto exacto, y de hecho, para la mayoría de los problemas combinatorios generalmente hay varios algoritmos diferentes de clasificación / desorganización posibles.
Un buen recurso es "Algoritmos combinatorios" de Kreher y Stinson. Este libro tiene una buena clasificación y algoritmos de clasificación claramente explicados. Hay recursos más avanzados, pero recomendaría Kreher como punto de partida. Como ejemplo de un algoritmo de clasificación, considere lo siguiente:
Esta es la clasificación de permutación, pero como se mencionó anteriormente, en muchos casos puede convertir una combinación de clasificación en un problema de permutación equivalente.
fuente