Algoritmo convencional BAT, conoce

Uno, árbol binario


1.1 Recorrido de árbol binario por capa

  • 1. Primero recorre el ancho del árbol binario
  • 2. El recorrido en amplitud primero utiliza a menudo una estructura de cola
  • 3. En la entrevista, este tipo de pregunta a menudo tiene algunas instrucciones en los saltos de línea, como imprimir el número de línea.

Tema 1: Dado el encabezado del nodo principal de un árbol binario, imprímalo en el formato que todos ven ahora. Solicite que se imprima como:

  El resultado de atravesar en orden de capas es el lado derecho:

Implementación del código Java:

    // 层序遍历
    // 时间复杂度:O(n)
    // 空间复杂度:O(n)
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new LinkedList<>();
        if (root == null) return res;
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            int size = queue.size();
            List<Integer> list = new LinkedList<>();
            for (int i = 0; i < size; i++) {
                TreeNode poll = queue.poll();
                list.add(poll.val);
                if (poll.left != null) queue.offer(poll.left);
                if (poll.right != null) queue.offer(poll.right);
            }
            res.add(list);
        }

        return res;
    }

1.2 Serialización y deserialización de árboles binarios

  1. Árbol binario ——> Cadena (serialización)
  2. Cadena ——> Árbol binario (deserialización)

Método de serialización:

  1. Serializar según el recorrido del pedido anticipado
  2. Serializar según el recorrido en orden
  3. Serialización transversal según pedido postal
  4. Serializar por capa

Caso número uno:

El proceso de grabar el árbol binario en un archivo se denomina serialización del árbol binario, y el proceso de reconstrucción del árbol binario original a partir del contenido del archivo se llama deserialización del árbol binario. Dado el encabezado del nodo principal de un árbol binario, se sabe que el tipo de valor de nodo del árbol binario es un entero de 32 bits. Diseñe un esquema de serialización y deserialización de árbol binario e impleméntelo en el código.

Caso uno respuesta:

  1. Suponiendo que el resultado de la serialización es str, inicialmente str es una cadena vacía.
  2. Si se encuentra un nodo vacío al atravesar el árbol binario primero, agregue "#!" Al final de str.
  3. Si encuentra un nodo que no está vacío, asumiendo que el valor del nodo es 3, agregue "3!" Al final de str.

Nota: Si no usa símbolos especiales para indicar el final del valor, el resultado de serialización de los dos árboles es: 123 ###, lo que significa que si no usa caracteres especiales para indicar el final del valor del nodo, se producirá ambigüedad.

Deserialización: cómo deserializar el resultado de un árbol binario a través del recorrido de preorden.

  1. Elija el método transversal para serializar y elija el método para deserializar.
  2. El resultado de la serialización de un árbol es único y el árbol binario generado por el resultado único también es único.

Segundo, ordenar

La complejidad del tiempo es O (n ^ 2): clasificación de burbujas, clasificación de selección, clasificación de inserción

2.1 Clasificación de burbujas

Idea del algoritmo de clasificación de burbujas:

  • La complejidad del tiempo es O (n ^ 2)
  • La complejidad del espacio es O (1)

Código de implementación:

 


2.2 Orden de selección

Ideas de algoritmos de selección y clasificación:

  • La complejidad del tiempo es O (n ^ 2)
  • La complejidad del espacio es O (1)

Código de implementación:

 


2.3 Orden de inserción

Insertar idea de algoritmo de ordenación:

  • La complejidad del tiempo es O (n ^ 2)
  • La complejidad del espacio es O (1)

Código de implementación:

 


Complejidad de tiempo: O (N * logN): clasificación de combinación, clasificación rápida, clasificación de pila, clasificación de Hill

2.4 Combinar clasificación

La idea del algoritmo de clasificación de fusión:

  • La complejidad del tiempo es O (N * logN)
  • La complejidad del espacio es O (1)

Código de implementación:

 


2.5 Clasificación rápida

Ideas de algoritmos de clasificación rápida:

  • La complejidad del tiempo es O (N * logN)
  • La complejidad del espacio es O (1)

Código de implementación:

 


2.6 Orden de montón

Idea del algoritmo de ordenación del montón:

  • La complejidad del tiempo es O (N * logN)
  • La complejidad del espacio es O (1)

Código de implementación:

 


2.7 Orden de colina

Idea del algoritmo de clasificación Hill: una versión mejorada de la clasificación por inserción, que mejora continuamente el tamaño del paso. La clave para la clasificación Hill es la elección del tamaño del paso.

  • La complejidad del tiempo es O (N * logN)
  • La complejidad del espacio es O (1)

Código de implementación:

 


El algoritmo de clasificación con complejidad de tiempo O (N) no es un algoritmo de clasificación basado en la comparación. La idea proviene de la clasificación de cubos: clasificación de conteo, clasificación cardinal

2.8 Contar y ordenar

Contando y ordenando ideas de algoritmos:

  • La complejidad del tiempo es O (N * logN)
  • La complejidad del espacio es O (1)

Escenarios aplicables: datos en un rango determinado

Código de implementación:

 


2.9 Orden de cardinalidad

Idea del algoritmo de clasificación de radix:

  • La complejidad del tiempo es O (N * logN)
  • La complejidad del espacio es O (1)

Código de implementación:

 


Complejidad espacial de los algoritmos de clasificación clásicos

  • O (1): clasificación por inserción, clasificación por selección, clasificación por burbujas, clasificación por montón, clasificación por colina
  • O (logN) ~ O (N): Clasificación rápida
  • O (N): combinación de clasificación
  • O (M): clasificación por conteo, clasificación por base

Estabilidad del algoritmo de clasificación clásico.

El concepto de estabilidad:

Supongamos que hay varios registros con la misma clave en la secuencia a ordenar. Si se ordenan, el orden relativo de estos registros permanece sin cambios. Este algoritmo de ordenación se dice que es estable, de lo contrario se llama inestable.

Concepto de clasificación estable:

Clasificación de burbujas, clasificación de inserción, clasificación de combinación, clasificación de recuento, clasificación de base, clasificación de cubo

Algoritmo de clasificación inestable:

Seleccionar clasificación, clasificación rápida, clasificación de colinas, clasificación de montón


Nota complementaria 1: el algoritmo de clasificación no tiene ventajas ni desventajas absolutas

Por lo general, no es fácil decir qué algoritmo de clasificación es bueno. Esto está relacionado con los elementos a ordenar. Por ejemplo, al ordenar la edad o la altura de las personas, debido a que este tipo de rango de datos suele ser relativamente pequeño, puede considerar usar la clasificación por conteo. Pero para enteros distribuidos uniformemente, el orden de recuento no es apropiado. A menos que se indique específicamente en la pregunta de la entrevista, se cree que el rango de datos que se van a clasificar se distribuye uniformemente.

Nota complementaria 2: ¿Por qué se llama Clasificación rápida?

La razón por la que la ordenación rápida se denomina ordenación rápida no significa que sea mejor que la ordenación en pila y la ordenación combinada. En el mejor de los casos, su complejidad progresiva es la misma que la ordenación por montón y la ordenación por combinación. Es solo que el coeficiente constante de clasificación rápida es relativamente pequeño.

Nota complementaria 3: Clasificación en ingeniería

  1. El tipo de ingeniería es un tipo completo.
  2. Cuando la matriz sea pequeña, inserte sort.
  3. Cuando la matriz es grande, clasificación rápida u otra clasificación O (N * logN).

Caso de clasificación uno:

Se conoce una matriz casi ordenada, que significa que si la matriz está ordenada, la distancia de cada elemento no excede K, y K es pequeña en relación con la longitud de la matriz. ¿Puedo preguntar qué método es mejor para clasificarlos?

Ideas:

Algoritmos de clasificación con complejidad de tiempo O (N): clasificación de conteo, clasificación cardinal, que no se basa en las restricciones de los algoritmos de clasificación por comparación y no es aplicable a todas las situaciones.

Algoritmo de clasificación con complejidad de tiempo O (N ^ 2): clasificación de burbujas, clasificación de selección. Estos dos algoritmos de ordenación no tienen nada que ver con la secuencia original de la matriz; ordenación por inserción, el proceso de ordenación por inserción está relacionado con el orden original y la distancia de movimiento de cada elemento no excede K.Para esta pregunta, ordenación por inserción O (N * K)

Algoritmo de clasificación con complejidad temporal de O (N * logN): clasificación rápida, independiente del orden original de la matriz. El tipo de combinación es independiente del orden original de la matriz.

Respuesta: ordenación de montón mejorada. Después de ordenar la matriz, cada número es O (logK), un total de N números y la complejidad de tiempo general es O (N * logK)


Clasificación del caso dos:

Determine si hay valores duplicados en la matriz. Debe garantizarse que la complejidad del espacio adicional sea O (1).

Idea: si no hay límite de complejidad de espacio, use una tabla hash. Implementación de la tabla hash, la complejidad del tiempo es O (N), la complejidad del espacio es O (N). Examine el algoritmo de clasificación clásico, la complejidad del espacio es limitada.

Respuesta: Ordene primero y los valores iguales se pegarán juntos después de ordenar. Entonces juzga. La clasificación de montón debe reescribirse en una versión no recursiva (la clasificación de montón clásica es recursiva)

 

 

 

 

Supongo que te gusta

Origin blog.csdn.net/weixin_32265569/article/details/109178992
Recomendado
Clasificación