Colección de citas famosas - Diccionario de frases chinas - Algoritmo de permutación y combinación de Vb.net

Algoritmo de permutación y combinación de Vb.net

Veo que dijiste que la recursividad es ineficiente. Entonces no es necesario.

El método dado es generar el primer arreglo y luego dar el siguiente arreglo cada vez que se llama a la función posterior, lo cual es muy eficiente y esta función se puede insertar.

¿Es este un algoritmo clásico de permutación y combinación? Puedes encontrar muchos en línea.

Probablemente el tipo de algoritmo que tiene movimiento direccional. Déjame buscarte uno.

Encontré algunos, que creo que son relativamente claros. Si no los comprende, puede consultarlos con atención. .

El algoritmo de permutación total es diferente a este. Necesita un pequeño cambio.

En cuanto al idioma, no debería haber mucho problema. . La versión básica es realmente rara y me da pereza escribir sobre ella ahora. . Todavía eres una persona.

★Algoritmo para generar permutaciones:

Por ejemplo, si desea generar una permutación completa de 5, 4, 3, 2, 1, primero encuentre la permutación mínima de 12345, y luego llama a n! Next_permutation() en el algoritmo STL secundario puede generar todas las permutaciones completas. Entonces, los detalles de este algoritmo son el mecanismo de implementación de next_permutation() en el algoritmo STL. Para obtener un código de implementación detallado, puede consultar el análisis del código fuente STL de Hou Jie. Aquí solo hablaré sobre mi comprensión:

1> es *i, el segundo elemento es *ii y satisface *I

2 & gt Luego, revisa hacia adelante desde el final para encontrar el primer elemento mayor que *i, convirtiéndolo en *k, intercambia I y Elementos K.

3 & gt Luego invierte ii y todos los elementos después de ii, que es la "siguiente" disposición.

La idea del algoritmo prev_permutation() es básicamente la misma, pero los puntos de inflexión que buscan son diferentes. En el algoritmo next_permutation(), buscan el punto de inflexión pico, mientras que en el algoritmo prev_permutation(), buscan el punto de inflexión del valle. Además, en el segundo paso, prev_permutation() busca el primer elemento menor que *i, no el primer elemento mayor que *i.

Te daré ejemplos específicos cuando tenga tiempo, ya es demasiado tarde :)

★Algoritmo para generar combinaciones:

Como se muestra en la captura de pantalla a continuación, hay dos situaciones: combinación completa y combinación r.

Aquí hay un código principal:

// -

//Generar la siguiente combinación (algoritmo de Rosen en la página 286)

// -

public int[] getNext () {

if (numLeft.equals (total)) {

num izquierda = num izquierda resta (. entero grande. uno);

Devuelve a;

}

int I = r-1;

mientras (a[ i ] == n - r + i) {

I-;

}

a[I]= a[I]+1;

p>

for(int j = I+1; j & ltr; j++) {

a[j]= a[I]+j-I;

}

num left = num left . rest(big integer. one);

Devolver a; //La matriz A devuelta aquí almacena la permutación y combinación de subíndices.

}

En este punto, es posible que tengas una pregunta, ¿qué pasa si no se requiere la permutación y combinación de caracteres o cadenas? Lo que hacemos es en realidad muy simple. Solo necesita tomar los subíndices de la matriz para realizar la permutación y combinación, devolver la permutación y combinación de sus subíndices y luego leer el valor de la cadena de la matriz original para generar todos los resultados de la permutación y combinación.