¿Puede Xiaobai realmente aprender el algoritmo de permutación completo leyendo un artículo?

¿Puede Xiaobai realmente aprender el algoritmo de permutación completo leyendo un artículo?Pieza de
hoy es algoritmo de Xiaohao "plan de título 365 Pincel", los primeros 97 días . ¡Compartiré contigo cómo usar un algoritmo para encontrar el arreglo completo! No hay mucho que decir, ¡solo mira la pregunta!

01

PARTE

¿Qué es la matriz completa?


¿Qué es la permutación completa? Tome cualquier m (m≤n) elementos de n elementos diferentes y organícelos en un cierto orden, lo que se denomina disposición de tomar m elementos de n elementos diferentes. Cuando m = n, todas las permutaciones se denominan permutaciones completas.


Por ejemplo, [1,2,3] Hay 6 tipos de todas las permutaciones:

¿Puede Xiaobai realmente aprender el algoritmo de permutación completo leyendo un artículo?

02

PARTE

Todas las preguntas ordenadas


Luego, cambie ligeramente todo el arreglo anterior y se convertirá en un problema de algoritmo. . .


Problema de permutaciones completas: dada una secuencia sin números repetidos, devuelve todas las permutaciones posibles .


Ejemplo:

Entrada: [1,2,3]

Salida:

[

[1,2,3],

[1,3,2],

[2,1,3],

[2,3,1],

[3,1,2],

[3,2,1]

]


03

PARTE

Análisis de solución de problemas


Este tipo de preguntas adaptadas de conocimientos matemáticos básicos siguen siendo muy populares en las entrevistas. Porque como entrevistador, puede utilizar este tema para mostrar su erudición. (falacia)


Si no estamos haciendo problemas de algoritmos, sino problemas matemáticos. Consideraremos cada posición una por una. Primero escriba el arreglo comenzando con 1, luego escriba el arreglo comenzando con 2 y finalmente escriba el arreglo comenzando con 3.

¿Puede Xiaobai realmente aprender el algoritmo de permutación completo leyendo un artículo?

¿Este tipo de pensamiento se parece mucho al proceso de solución de profundidad primero (DFS)?
1. Primero elegimos 1, y luego elegimos 2 para el segundo lugar de 1. En este momento, solo podemos elegir 3 para el tercer lugar de 1.

¿Puede Xiaobai realmente aprender el algoritmo de permutación completo leyendo un artículo?

2. Después de completar los pasos anteriores, debemos volver a 1, porque solo hay 1 y hay otras opciones 1-3, y luego, después de completar 1-3, solo hay 1-3-2.

¿Puede Xiaobai realmente aprender el algoritmo de permutación completo leyendo un artículo?

3. En este momento, debemos ir de 1-3-2, volver a 1-3, volver a 1, luego volver al nodo raíz, y luego seleccionar 2 nuevamente.

¿Puede Xiaobai realmente aprender el algoritmo de permutación completo leyendo un artículo?

4. El siguiente proceso es similar, por lo que no lo describiré paso a paso.

¿Puede Xiaobai realmente aprender el algoritmo de permutación completo leyendo un artículo?

Por supuesto, si no se omite el proceso de retroceso, se verá así:

Haz clic en mí para ver el video

El análisis anterior está terminado, pero aún así no evita que continúe aturdido. . . "¿No es una matriz para mí? ¡¡¡Como algoritmo calificado, ni siquiera sé cómo se usa DFS en él !!!" Quería dejar el código después de pensarlo y decidí. Habla sobre ello.

¿Puede Xiaobai realmente aprender el algoritmo de permutación completo leyendo un artículo?

Primero descartamos el código (tenga en cuenta que este código no es óptimo, por lo que es fácil de entender para todos. Por ejemplo, también podemos optimizar por reemplazo u otros métodos de optimización. Pero todos son iguales, el núcleo es proceso retrospectivo):

 1//JAVA
 2class Solution {
 3    List<List<Integer>> ans = new ArrayList<>();
 4
 5    public List<List<Integer>> permute(int[] nums) {
 6        dfs(nums, new ArrayList<>());
 7        return ans;
 8    }
 9
10    private void dfs(int[] nums, List<Integer> tmp) {
11        System.out.println(Arrays.toString(nums) + "," + tmp);
12        if (tmp.size() == nums.length) {
13            ans.add(new ArrayList<>(tmp));
14        } else {
15            for (int num : nums) {
16                if (!tmp.contains(num)) {
17                    tmp.add(num);
18                    dfs(nums, tmp);
19                    tmp.remove(tmp.size() - 1);
20                }
21            }
22        }
23    }
24
25}

Si nums es [1,2,3], aparecerá la siguiente salida:

¿Puede Xiaobai realmente aprender el algoritmo de permutación completo leyendo un artículo?

De hecho, este código es fácil de entender, ¿qué hizo? Es decir, cuando enumeramos cada dígito en orden, tenemos que excluir los números que se han seleccionado (código de la línea 16), por ejemplo, seleccionamos tres números arriba:

  • Al enumerar el primer lugar, hay tres situaciones

  • Al enumerar el segundo lugar, solo hay dos casos (un número que ha aparecido antes no puede volver a aparecer)

  • Al enumerar el tercer dígito, solo hay una situación (los dos números que han aparecido antes no pueden volver a aparecer)

¡El código completo realmente hace tal cosa! El código en la línea 12 en realidad significa que cuando la enumeración alcanza el último dígito, este es el resultado de la permutación que queremos, por lo que tenemos que ponerlo en el conjunto de resultados de permutación completo .

Luego hay otro código muy importante, en realidad es la línea 19. ¿Qué está haciendo realmente este paso? Para decirlo sin rodeos, cuando volvamos al anterior, debemos cancelar el resultado de la última selección . De lo contrario, si lo ha elegido antes, no podrá seguir usándolo más tarde.


Reitere solemnemente (debe leer mi artículo):

  • En todos los tutoriales de esta serie no se utilizarán características de lenguaje complicadas. No tiene que preocuparse por no aprender la gramática relevante, ¡las ideas de algoritmos son las más importantes!

  • Como artículo académico, aunque el estilo puede ser interesante, pero riguroso, lo digo en serio. Todos los códigos de este artículo se han probado y se han ejecutado en leetcode.

04

PARTE

Prolijo


El método de retroceso (método de exploración y retroceso) es una especie de método de búsqueda óptimo, también conocido como método heurístico, que busca hacia adelante según las condiciones óptimas para lograr el objetivo. Pero cuando llegas a un cierto paso, te das cuenta de que la elección original no es buena o que el objetivo no se ha logrado, así que retrocedes un paso y eliges de nuevo. Esta técnica de retroceder y retroceder es el método de retroceso, y el punto de un cierto estado que satisface la condición de retroceso. Esto se denomina "punto de retroceso".


Esta es la pregunta de matriz completa más simple. Tenga en cuenta que en la solución anterior, no introduje ningún término profesional como estado, ruta, lista de selección, condición final, etc., y ni siquiera mencioné el concepto de retroceso.

¿Puede Xiaobai realmente aprender el algoritmo de permutación completo leyendo un artículo?

La razón para decir esto es que espero que podamos comenzar desde el pensamiento humano más simple, en lugar de aplicar algunos marcos. . . . Por supuesto, en cuanto a más conceptos y marcos de retroceso, se los presentaré en temas más complicados más adelante.

Supongo que te gusta

Origin blog.51cto.com/15076236/2609700
Recomendado
Clasificación