Resta de algoritmos

La diferencia entre dividir y conquistar y restar.

El método divide y vencerás divide un gran problema en varios subproblemas, resuelve cada subproblema por separado y luego fusiona las soluciones de los subproblemas para obtener la solución del problema original.

El método de reducción y gobernanza también divide un gran problema en varios subproblemas, pero estos subproblemas no necesitan resolverse por separado, solo uno de los subproblemas debe resolverse, por lo que no es necesario fusionar las soluciones de los subproblemas.

Por lo tanto, estrictamente hablando, el método de reducción y gobernanza debería ser un método degradado de divide y vencerás, y la complejidad temporal es generalmente O (log2 n).

Después de descomponer el problema original en varios subproblemas, el método de reducción y gobernanza utiliza la relación entre la solución del problema original de escala ny la solución de una escala menor (generalmente n / 2). Esta relación generalmente se expresa para:

(1) La solución del problema original solo existe en uno de los subproblemas más pequeños;

(2) Existe cierta correspondencia entre la solución del problema original y una de las soluciones de menor escala.

Inserte la descripción de la imagen aquí

Encuentra el método de reducción en el problema

Encontrar por la mitad

La búsqueda binaria aprovecha las características de que los registros están ordenados según el código clave. La idea básica es: en la lista ordenada, el registro intermedio se toma como objeto de comparación. Si el valor dado es igual al código clave del registro intermedio, la búsqueda es exitosa; si se da Si el valor es menor que el código clave del registro del medio, continúe buscando en la mitad izquierda del registro del medio; si el valor dado es mayor que el código de clave del registro del medio, continúe buscando en la mitad derecha del registro del medio. Repita el proceso anterior hasta que la búsqueda sea exitosa, o el área buscada no tenga ningún registro y la búsqueda falle.Inserte la descripción de la imagen aquí

  1. Oferta demostrar la seguridad 53 - II 0 ~ n- 1 números que faltan. - Simple Código

  2. 668. La tabla de multiplicar en números pequeños de K - Código difícil

Árbol de búsqueda binaria

El árbol de búsqueda binaria, también conocido como árbol de ordenación binaria, es un árbol binario con las siguientes propiedades;

(1) Si su subárbol izquierdo no está vacío, los valores de todos los nodos en el subárbol izquierdo son menores que el valor del nodo raíz

(2) Si su subárbol derecho no está vacío, los valores de todos los nodos del subárbol derecho son mayores que el valor del nodo raíz

(3) Sus subárboles izquierdo y derecho también son árboles de ordenación binaria

El proceso de encontrar un valor k dado en la raíz del árbol de ordenamiento binario es:

(1) Si la raíz es un árbol vacío, la búsqueda falla

(2) Si k = el valor del nodo raíz, la búsqueda es exitosa

(3) De lo contrario, si k <el valor del nodo raíz, busque en el subárbol izquierdo de raíz

(4) De lo contrario, busque en el subárbol derecho de la raíz

Se siente inútil hablar de esto El árbol de búsqueda binaria más problemático es cómo construir este árbol. Y de hecho, la búsqueda binaria es utilizar una matriz para representar la estructura del árbol de búsqueda binaria. Hice esto sin buscar ningún problema, no esperaba escenas.

Reducción y regla en el problema de clasificación

Tipo de pila

Definición: Heap es un árbol binario completo con las siguientes propiedades: el valor de cada nodo es menor o igual que el valor de sus nodos secundarios izquierdo y derecho (pequeño montón raíz); o el valor de cada nodo es mayor o igual que el valor de sus nodos secundarios izquierdo y derecho Valor (montón de raíces grandes). Si las pilas con nodos se numeran desde 1 en orden, los nodos cumplen la siguiente relación:

(1) ki <= k (2i) 且 ki <= k (2i + 1)

(2) ki> = k (2i) ki> = k (2i + 1)

1 <= i <= n / 2

Esta definición realmente explica las características de los datos cuando se usa una matriz para almacenar el montón.

Inserte la descripción de la imagen aquí

La clasificación de pila es un método de clasificación que utiliza las características de la pila. La idea básica es: Primero, la secuencia de registros que se van a ordenar se construye en una pila. En este momento, se selecciona el registro más grande de la pila, el registro superior, y luego Retire de la pila y ajuste los registros restantes en una pila, de modo que se encuentre el siguiente registro más grande, y así sucesivamente, hasta que solo haya un registro en la pila.

Inserte la descripción de la imagen aquí

La cuestión del ajuste del montón es la clave, que incluye principalmente el método de ajuste de cribado y el método de inserción.

El problema clave que debe resolver el método de filtrado para ajustar el montón es: en un árbol binario completo, los subárboles izquierdo y derecho del nodo raíz son montones, ¿cómo ajustar el nodo raíz para que todo el árbol binario completo se convierta en un montón?

El método es: el nodo raíz se compara con los nodos raíz de los subárboles izquierdo y derecho, y el valor máximo se intercambia con el nodo raíz hasta que todos los subárboles son montones o los nodos ajustados alcanzan los nodos hoja.
Inserte la descripción de la imagen aquí

El problema que debe resolver el método de inserción para ajustar el montón es: insertar un nodo en el montón, ¿cómo ajustar el nodo insertado para que todo el árbol binario completo siga siendo un montón?

El método es: inserte un nodo al final, compare el nodo con el nodo principal, si no se cumple la condición del montón, intercambie el nodo con el nodo raíz y repita este proceso hasta que el nodo sea más pequeño que el nodo principal o se alcance el nodo raíz.
Inserte la descripción de la imagen aquí

La clasificación de montón necesita completar dos operaciones:

1) Ajuste la matriz a un montón:

  • Método 1: A partir del último nodo no hoja, compare los valores de este nodo y sus nodos secundarios para el ajuste. Una vez completado el ajuste, compare el penúltimo nodo no hoja y continúe este proceso hasta el nodo raíz. El primer nodo hoja debe tener una longitud de secuencia / 2, por lo que el índice del primer nodo no hoja es arr.length / 2 -1. referencia
  • Método 2: use el método de inserción, inserte uno por uno en el orden de la matriz

2) Clasificación: intercambie el nodo raíz y el último nodo hoja, y luego use el método de filtrado para reconstruir los elementos restantes en una pila

  1. . K 17.14 Número mínimo de preguntas de la entrevista - Código medio

Seleccionar pregunta

Suponga que la secuencia desordenada T = (r1, r2, ……, rn), el k-ésimo (1 <= k <= n) elemento pequeño de T se define como el elemento en la k-ésima posición después de que T se dispone en orden ascendente. Dada una secuencia T y un número entero k, el problema de encontrar el k-ésimo elemento más pequeño de T se llama problema de selección. En particular, el problema de encontrar el n / 2º elemento más pequeño se llama problema de la mediana.

Este tipo de pregunta puede aprender del proceso de división de clasificación rápida. Cada vez que se divide, se determinará un valor de eje y se juzgará si la posición del valor del eje es mayor o menor que k, reduciendo así el rango. La complejidad temporal de utilizar este esquema es O (n).

Inserte la descripción de la imagen aquí

La diferencia entre este tipo de pregunta y el número K mínimo anterior es que uno elige un valor y debe devolver un cierto rango.

  1. 215. array K-ésimo elemento más grande - Código medio

Problemas de reducción y gobernanza en combinación

Pregunta del campeonato eliminatorio

Suponga que hay n = 2 ^ k jugadores en la competencia de eliminación económica, y el ganador final está determinado por la función bool Comp (string mem1, string mem2)

Simula un partido entre dos jugadores. Si mem1 gana, la función Comp devuelve VERDADERO. En caso contrario, la función Comp devuelve FALSO. Se asume que la ejecución de la función Comp se puede completar en un tiempo constante. ¿Cómo simular el proceso del juego de eliminación? La complejidad de tiempo requerida es O (n).

Esta idea es relativamente simple. Divida a todos los usuarios en dos partes iguales. Los índices iniciales de los dos segmentos son 0 y n / 2. Compare 0 con n / 2, y el ganador se coloca primero. Atravesar hasta n / 2-1, los primeros n / 2 son todos vencedores. Divida por la mitad nuevamente, haga este ciclo y finalmente la 0ª persona es el ganador final.

Es difícil encontrar las preguntas de práctica correspondientes para este tipo de pregunta, porque este tipo de pregunta tiene la característica de que solo uno de los dos datos puede sobrevivir. Además, escribir esta pregunta no es muy difícil, así que no lo haré, pero si tienes una pregunta adecuada, puedes proporcionármela.

Problema de moneda falsa

Entre n monedas con la misma apariencia, una es falsa y se sabe que las monedas falsas son ligeras. Puede comparar dos juegos de monedas a voluntad mediante una balanza sin báscula, para saber si el peso de los dos juegos de monedas es el mismo o cuál es más liviano, pero no sé cuánto más liviano. El problema de la moneda falsa requiere el diseño de un algoritmo divertido. Se detectó esta moneda falsa.

Como sé qué moneda falsa enseña la luz, la idea de cálculo es relativamente simple

Esquema 1: Divida en dos pilas, compare, la pila más ligera se divide en dos pilas, hasta que se encuentre la moneda más ligera, la complejidad del tiempo es O (log2 n)

Opción 2: Dividir en tres pilas. Si las dos pilas tienen el mismo peso, la tercera pila tiene monedas falsas, si se comparan las dos pilas, hay una pila de monedas falsas. Repita este proceso hasta encontrar la moneda más ligera, la complejidad del tiempo es O (log3 n)

Ahora compliquemos el problema: si hay 8 monedas (abcdefgh), ¿la moneda falsificada es más ligera o más pesada ?, ¿cómo solucionarlo?

Para resolver este problema, debe utilizar un árbol de decisiones y dejar los detalles específicos para que todos piensen en ellos.
Inserte la descripción de la imagen aquí

No hay una pregunta correspondiente sobre el problema de la moneda falsa. Después de todo, la pregunta que vale la pena pero que no está permitida es más difícil de encontrar, y es más difícil de aceptar para todos, pero en la vida real, esto sigue siendo muy útil.

para resumir

El método de reducción y gobernanza es similar al método de divide y vencerás, excepto que la escala del método de reducción y gobernanza se reducirá a la mitad cada vez. En este artículo, debemos centrarnos en

Encuentra el problema: encuentra a la mitad

Problema de clasificación: clasificación de montón , problema de selección

Puede que le resulte fácil encontrar la búsqueda binaria. De hecho, es fácil de entender. Cuando se codifica, hay muchas condiciones de límite involucradas. He entrevistado a muchas personas con la búsqueda binaria y pocas pueden escribir perfectamente.

Debe dominar la clasificación de montones Hay demasiados ejercicios relacionados con el montón, por lo que debe hacerlo usted mismo.

Al final

Si te gusta mi artículo, puedes seguir mi cuenta pública (Programador Mala Tang)

Revisión de artículos anteriores:

algoritmo

  1. Plan de aprendizaje de algoritmos
  2. Método de fuerza bruta
  3. Divide y conquistaras
  4. Método de reducción

tecnología

  1. Hablando de microservicios
  2. Optimización del rendimiento de TCP
  3. Realización del límite de corriente 1
  4. Redis implementa bloqueos distribuidos
  5. Seguimiento de errores del código fuente de Golang
  6. El principio de realización de la atomicidad, consistencia y durabilidad de las transacciones
  7. Explicación detallada del proceso de solicitud de CDN
  8. La historia del servicio de blogs siendo aplastado
  9. Técnicas comunes de almacenamiento en caché
  10. Cómo conectarse de manera eficiente con pagos de terceros
  11. Versión concisa del marco de gin
  12. Un breve análisis de los bloqueos y transacciones de InnoDB

leyendo notas

  1. Revolución ágil
  2. Cómo ejercitar tu memoria
  3. Lógica simple después de la lectura
  4. Aire caliente después de la lectura
  5. Las analectas-pensamientos después de leer

Pensando

  1. Algunas opiniones sobre la gestión de proyectos
  2. Algunas reflexiones sobre los gerentes de producto
  3. Reflexiones sobre el desarrollo profesional de los programadores
  4. Pensando en la revisión del código
  5. Recomendación del editor de Markdown-typora

Supongo que te gusta

Origin blog.csdn.net/shida219/article/details/108680067
Recomendado
Clasificación