Los algoritmos de disposición y combinación son ampliamente utilizados y deben dominarse. Para reducir el umbral, este artículo se centra principalmente en la lógica y la simplicidad del algoritmo, pero no presta atención a la eficiencia del algoritmo. Combinando la implementación en libros en línea y sus propias necesidades, hay cuatro objetivos aquí:
1. Arreglo completo de todos los elementos: la disposición completa de AB es AB, BA (pedido relacionado);
2. Combinación completa de todos los elementos: la combinación completa de AB es A, B, AB (orden irrelevante);
3. Descubra cuáles son las combinaciones de seleccionar m elementos entre n elementos: la combinación de 2 elementos en ABC es AB, AC, BC;
4. Descubra cuáles son los arreglos para seleccionar m elementos entre n elementos: los arreglos para seleccionar 2 elementos en ABC son AB, BA, AC, CA, BC, CB;
Se puede encontrar que después de encontrar la disposición de seleccionar m elementos entre N elementos, en realidad organizamos el conjunto de elementos (matrices) compuestos de cada combinación después de encontrar el método de combinación para seleccionar m elementos entre los elementos N, por lo que es una función de ensamblaje y los ejemplos no figuran en la lista. Para los otros tres objetivos, vea el código:
Pública clase final PermutationCombinationHolder { / ** Combinación completa de elementos de matriz* / combinación void static (char [] chars) {char [] subchars = new Char [chars.length]; // matrices que almacenan datos de subcombinación // El problema de toda la combinación es seleccionar 1 elemento de todos los elementos (denotado como n), más la combinación de 2 elementos ... más la suma de la combinación de n elementos para (int i = 0; i <chars.length; ++ i) {final int m = i +1; combinación (chars, chars longitud, m, subcars, m); }} /*** Implementación de la combinación de n elementos con n elementos. El principio es el siguiente: * Seleccione de detrás al frente, seleccione la posición I y luego seleccione M-1 en el primer I-1. * Por ejemplo: se seleccionan 3 elementos de 1, 2, 3, 4, 5. * 1) Después de seleccionar 5, luego seleccionar 2 en los primeros 4, y seleccionar 2 en los primeros 4 es otro subproblema, simplemente recursivo; * 2) Si no incluye 5, seleccione 4 directamente, luego seleccione 2 en los primeros 3 y seleccionar 2 en los primeros tres es otro subproblema, simplemente recursivo; * 3) Si no incluye 4, seleccione 3 directamente, luego seleccione 2 en los primeros 2, y solo hay dos en los primeros 2. * Mirando la dirección vertical, 1 y 2 y 3 son un bucle para el bucle, el valor inicial es 5, y el valor final es m. * Mirando la dirección horizontal, este problema es un recursivo de M-1 en el primer I-1. */combinación void static (char [] chars, int n, int m, char [] subchars, int subn) {if (m == 0) {// exportar para (int i = 0; i <subn; ++ i) {system.out.print (subchars [i]); } System.out.println (); } else {for (int i = n; i> = m; --i) {// Seleccione Subchars [m - 1] = chars [i - 1]; // seleccionar una combinación (chars, i - 1, m - 1, subcars, subn); // Seleccione M-1 de la primera I-1 para la recursión}}}}/ ** Permutación completa de los elementos de matriz*/ Permutación void estática (char [] chars) {permutación (chars, 0, chars longitud-1); } /** Subrays en la matriz desde el índice comienza a índice end participar en permutación completa* /permanente void static (char [] chars, int begin, int end) {if (begin == end) {// La salida es cuando solo el último carácter se deja (int i = 0; i <charslength; ++ i) {system.out.print (chars [i]); } System.out.println (); } else {for (int i = begin; i <= end; ++ i) {// Cada carácter se fija al primero if (canswap (chars, begin, i)) {// deduplicate swap (chars, begin, i); // Swap Permutation (chars, Begin + 1, End); // Encuentra recursivamente la permutación completa del intercambio de sub-matrices (chars, begin, i); // restaurar}}}}} static void swap (char [] chars, int from, int to) {char temp = chars [from]; chars [from] = chars [to]; chars [to] = temp; } static boolean canswap (char [] chars, int begin, int end) {for (int i = begin; i <end; ++ i) {if (chars [i] == chars [end]) {return false; }} return verdadero; } public static void main (string [] args) {final char [] chars = new char [] {'a', 'b', 'c'}; permutación (chars); System.out.println ("====================================================== System.out.out.println (chars);}}Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.