Generador de Combinaciones de n, r en Java
Gracias a la pregunta de una amiga sobre Matemáticas Discretas, en esta ocasión quiero compartir un poco acerca de la combinatoria enumerativa, la cual estudia los métodos para contar (enumerar) las distintas configuraciones de los elementos de un conjunto que cumpla con ciertos criterios especificados.
Esta fue una de las primeras áreas de la combinatoria en ser desarrollada, y como otras áreas más recientes se estudian sólo en cursos especializados, es común que se haga referencia a esta subárea cuando se menciona combinatoria en entornos educativos.
Un ejemplo citado de Wikipedia para facilitar la comprensión de este artículo es el siguiente:
Considérese el conjunto S = {A, E, I, O, U}. Podemos imaginar que estos elementos corresponden a tarjetas dentro de un sombrero.
- Un primer problema podría consistir en hallar el número de formas diferentes en que podemos sacar las tarjetas una después de otra (es decir, el número de permutaciones del conjunto). Por ejemplo, dos formas distintas podrían ser: EIAOU o OUAIE.
- Después, se puede preguntar por el número de formas en que se puede sacar sólo 3 tarjetas del sombrero (es decir, el número de 3-permutaciones del conjunto). En este caso, ejemplos pueden ser IOU, AEI o EAI.
- También se puede preguntar sobre cuáles son los posibles grupos de 3 tarjetas que se pueden extraer, sin dar consideración al orden en que salen (en otras palabras, el valor de un coeficiente binomial). Aquí, consideraríamos AOU y UAO como un mismo resultado.
- Otro problema consiste en hallar el número de formas en que pueden salir 5 tarjetas, una tras otra, pero en cada momento se regresa la tarjeta escogida al sombrero. En este problema los resultados posibles podrían ser EIOUO, IAOEU o IEAEE.
Luego de esta explicación teórica procedamos a trabajar con el código, la siguiente función genera las combinaciones utilizando un algoritmo de Kenneth H. Rosen.
//La función recibe los valores de n y r como argumentos
public static void combinaciones(int n, int r)
{
int i = 0, j = 0, ci = 0;
int v[] = new int[n];
for(i = 0; i < n; i++)
{ v[i]=i; }
escribe(v, r);
ci++;
while(ci < p1)
{
i = r - 1;
while (v[i] == n - r + i) { i--; }
v[i] = v[i] + 1;
for (j = i + 1; j < r; j++) { v[j] = v[i] + j - i; }
escribe(v,r);
ci++;
}
}
La función de nombre "escribe" que es llamada en el código anterior nos sirve para imprimir los resultados en la consola del IDE, para descargar una copia completa del Programa funcionando procede a la JavaBox al final del Blog.
Excelente blog =D Me ha servido de mucho sus ejemplos, continuen asi, hacen que java sea mas entendible xD
ResponderBorrarDonde se encuentra la funcion "escribe"... disculpa no entendi donde puedo obtenerla..
BorrarGracias por tus palabras Mario, comentarios así hacen que sigamos adelante!! =)
BorrarCon respecto al método escribe que es llamado en el ejemplo, solo es una función que se creó para personalizar el formato de impresión de las combinaciones, por ejm algo así:
Borrarpublic void escribe(int v[],int r)
{
for(int i=0;i<r;i++) {
System.out.format("%3d",v[i]);
}
System.out.println("");
}
Espero que te sirva, saludos! =)
muy bien echo!
ResponderBorrarGracias!! =)
Borraruna pregunta, como lo implemento en Java
ResponderBorrarEl código puesto en el post está en java, es una función, a la cual solo debes llamarla en el método Main y pasar los datos con los que deseas que este trabaje.
BorrarSuerte!! =)
pero como lo implemento, desde que clase lo llamo?
BorrarLo llamas desde tu clase principal, aquella que tu crees, por ejm:
BorrarEl código del post lo pones en la clase "Combinaciones.java"
Luego creas una clase "Principal.java", la cual contiene el método Main, y desde ahí creas una instancia del objeto Combinaciones y accedes al metodo "combinaciones", pasando los datos que necesita el programa para funcionar, ahora lo único que te faltaría es implementar otro método llamado "escribe" para personalizar la forma de imprimir las combinaciones en la consola.
Saludos!!
Se agradece, ahi vamos a probar como funciona
ResponderBorrarDe nada Daniel, suerte!!! =)
BorrarQue es p1 ??
ResponderBorrarno la veo inicializada, y la usas en while(ci < p1)
Hola Mario, la variable es declarada en tu clase, lo publicado es el método que te sirve para las combinaciones.
BorrarPuedes declararla así: double p1=0;
Igual puedes encontrar una copia de todo el código en la Java Box al final del blog.
Suerte!!
Muy bueno, creo que tomaré algo para mi blog, y lo mejoraré :D Obviamente con el debido crédito ;) Espero que no sea ningún problema. Saludos.
ResponderBorrarHola Julian, gracias por tus comentarios, claro que si, gracias por comentar y sobre lo del crédito.
BorrarSaludos! =)
La variable p1 donde se declara y como se utiliza?
ResponderBorrarLa variable es declarada en tu clase, lo publicado es el método que te sirve para las combinaciones.
BorrarPuedes declararla así: double p1=0;
Igual puedes encontrar una copia de todo el código en la Java Box al final del blog.
Suerte!!
Muchas gracias me sirvió bastante
BorrarDe nada, me alegro que te haya servido!! =)
Borrargraciass
ResponderBorrarHola, de nada, me alegra que te haya servido bastante.
BorrarSaludos! =)