[Artículos secos técnicos] La mejor estructura de clasificación y datos de la historia

Prólogo

He estado trabajando durante un tiempo, y algunas veces bromeo con mis colegas: " Si me dejas escribir un pedido rápido ahora, me temo que no puedo hacerlo ".

Si no toca el algoritmo por un tiempo, es realmente fácil de olvidar. No lo creas? Ahora piensa si puede escribir un montón por sí mismo.

Cualquiera que haya experimentado el reclutamiento escolar sabe que los algoritmos y las estructuras de datos son inevitables.

En el examen escrito, lo más importante son las preguntas del examen. Para grandes empresas como Pinduoduo y Toutiao, surgen algunas preguntas sobre algoritmos. Si no tiene un AC, no hay oportunidades de entrevista.

También se hacen preguntas sobre algoritmos durante las entrevistas (entrevistas en el sitio o entrevistas en video). La dificultad definitivamente no es tan difícil como en el examen escrito. Podemos imaginar una escena donde la mitad de la entrevista está sucediendo. El entrevistador le pide que invierta el árbol binario y se pregunte ahora, ¿lo hará?

No está lejos. Si todavía está en la universidad, puede comenzar con la clasificación y varias estructuras de datos básicos . Me llevó una semana hacer las ocho clasificaciones básicas y la lista vinculada / árbol binario / pila / cola en un hermoso PDF .

Esta experiencia de lectura de PDF es definitivamente mejor que la cuenta pública y los artículos en las principales plataformas de blogs. El contenido PDF es puramente mano a mano , si no lo comprende, puede preguntarme.

La siguiente es una breve introducción a las ocho estructuras básicas de clasificación y datos básicos: la idea de cada clasificación y la explicación básica y el código fuente están en PDF.

 

Tipo de burbuja

Idea: los dos se intercambian, el grande se coloca en la parte posterior y el valor máximo ya está al final de la matriz después del primer ordenamiento. Debido a que los dos se intercambian, necesita una clasificación n-1 (como 10 números, 9 clasificación)

Puntos de implementación de código: dos para bucles, el bucle externo controla el número de pasadas de clasificación y el bucle interno controla el número de comparaciones . Después de cada viaje, el número de comparaciones debe reducirse en 1.

 

 

Seleccionar orden

Idea: Encuentre el elemento más grande en la matriz e intercambíelo con el último elemento de la matriz. Cuando solo hay un número, no hay necesidad de seleccionar, por lo que necesita una clasificación n-1

Puntos de implementación de código: dos para bucles, el bucle externo controla el número de pasadas ordenadas, el bucle interno encuentra el número máximo de pasadas actuales y luego intercambia con el último elemento de la matriz de pasadas actuales

 

Insertar ordenación

Idea: Insertar un elemento en una matriz ordenada existente. Se desconoce si hay datos ordenados al principio, por lo que el primer elemento del elemento se considera ordenado . Compare con una matriz ordenada, si es más grande , se colocará directamente, si es más pequeña, moverá la posición del elemento de la matriz y encontrará una posición adecuada para insertar . Cuando solo hay un número, no es necesario insertarlo, por lo que se requiere una clasificación n-1

Implementación de código: un bucle for está incrustado con una implementación de bucle while, el bucle for externo controla el número de viajes ordenados y el bucle while encuentra una posición de inserción adecuada (y la posición de inserción no puede ser inferior a 0)

 

Ordenación rápida

Requisitos previos para aprender la ordenación rápida: es necesario comprender la recursividad

Idea: Encuentre un elemento (nodo) en la matriz, colóquelo más pequeño a la izquierda del nodo y colóquelo más grande a la derecha del nodo. Un viaje hacia abajo, más pequeño que el nodo de la izquierda, más grande que el nodo de la derecha. Sigue realizando esta operación ...

Implementación del código: el pivote se toma en el medio, y L y R se usan para denotar las posiciones mínima y máxima de la matriz. La comparación continúa hasta que se encuentra un número menor (mayor) que el pivote, y luego se intercambia, reduciendo continuamente el rango. Recursión L al elemento (j) antes del pivote. Un elemento (i) al elemento R después del pivote recursivo

 

Ordenar fusión

La premisa de aprender a combinar: es necesario comprender la recursividad

Idea: combinar dos matrices ordenadas en una matriz ordenada. Separe los elementos como una matriz ordenada y compárelos y combínelos . Continúa dividiendo y fusionando hasta que solo haya un elemento

Implementación del código: en el primer proceso de clasificación, se combinan esencialmente dos elementos (considerados como dos matrices ordenadas existentes). Continúe realizando tales operaciones, y finalmente la matriz se ordena, se divide a la izquierda, derecha, se fusiona ...

 

 

 

Tipo de montón

La premisa de aprender la ordenación del montón: es necesario comprender el árbol binario

Idea: la ordenación del montón utiliza una característica de un árbol binario completo. El nodo raíz es más grande que los elementos secundarios izquierdo y derecho. Completar una operación de construcción de montón es esencialmente comparar el tamaño del nodo raíz y los elementos secundarios izquierdo y derecho. El grande se cambia a la raíz En los nodos, hasta que el nodo más grande esté en la parte superior del árbol . Luego intercambie con el último elemento de la matriz

Implementación del código: siempre que el subárbol izquierdo o derecho sea mayor que el nodo raíz actual, reemplácelo. Después del reemplazo, el siguiente subárbol cambiará, por lo que también es necesario comparar hasta que cada nodo se dé cuenta de la condición de padre> hijo

 

 

 

Sort Hill

Idea: la ordenación en pendiente es esencialmente una versión mejorada de la ordenación por inserción. La ordenación en pendiente divide la matriz en n grupos para la ordenación por inserción, hasta que la matriz está ordenada macroscópicamente, y luego no hay necesidad de moverse tantas veces al realizar la ordenación por inserción. ~

Pensamiento de código: el incremento de Hill es generalmente gap = gap / 2, pero hay más de un bucle for que la versión normal de ordenación por inserción.

 

Clasificación de cardinalidad (clasificación de cubos)

Idea: clasificación de cardinalidad (clasificación de cubetas): corte los números en uno, diez, cien, mil y colóquelos en diferentes cubos, y vuelva a colocarlos en el orden de cubetas una vez, hasta que se complete el número de los dígitos más grandes ~ Entonces La matriz está ordenada

Implementación del código: primero encuentre el valor máximo de la matriz y luego use el valor máximo / 10 como condición del bucle (siempre que> 0, entonces todavía hay dígitos). Distribuya dígitos individuales, diez dígitos, ... al depósito y recíclelo cada vez que se asigne

 

 

 

Recursivo

La recursión se usa mucho, mucho en el algoritmo. La ordenación rápida y la fusión del algoritmo de ordenación necesitan usar la recursión (al menos es más conveniente implementar la recursión).

Si desea utilizar la recursividad, debe conocer dos condiciones: salida recursiva (condición para terminar la recursividad) y expresión recursiva (ley)

Consejo: en la recursividad, el problema a menudo se divide en dos partes (1 y la idea completa) , lo que nos permite encontrar rápidamente expresiones recursivas (leyes)

 

Hanrota logra:

 

 

 

Estructura de datos básicos

Las listas enlazadas, las colas, los árboles binarios y las pilas son estructuras de datos muy básicas. Habrá preguntas de algoritmo correspondientes para cada estructura de datos, por ejemplo:

  • LeetCode No206: Lista vinculada inversa
  • LeetCode No20: Verifique la cadena [] {]} {] {} (Si dicha cadena es válida (alineada)
  • LeetCode No104: profundidad máxima del árbol
  • LeetCode No102: árbol transversal de secuencia
  • ...

Los reclutas escolares no solicitan estructuras de datos como árboles de diccionario, árboles rojo-negros y gráficos, pero los problemas de las estructuras de datos vinculados de lista, cola, árbol binario y pila (LeetCode es simple) aún deberían poder resolverse.

Pasado

Lo último que quiero explicar es que el código del algoritmo de clasificación / estructura de datos puede no ser la solución óptima, y ​​la implementación del código está escrita de una manera más fácil de entender. Casi todas las oraciones tienen un comentario correspondiente, que debería ser comprensible.

Ha estado funcionando durante un tiempo ahora. ¿Por qué quiere escribir los algoritmos y estructuras de datos más básicos? Las razones son las siguientes:

  • Soy una persona que busca la tipografía . Si sigo a mis compañeros de clase desde el principio, puedo encontrar que mi GitHub y la navegación del artículo read.me cambiarán con frecuencia. La navegación actual de GitHub no es lo que me gusta (demasiado tiempo), y el artículo anterior, para ser honesto, la composición tipográfica no es suficiente, decidí comenzar una ola nuevamente.
  • Mi artículo se distribuirá en varias plataformas, pero nadie podrá leerlo después de que el artículo esté terminado, y es probable que la cama del mapa se cuelgue debido a la cadena antirrobo de la plataforma. Porque muchos lectores me preguntaron: " ¿Puedes convertir tu artículo a PDF ?"
  • He escrito muchas series de artículos, y estos artículos difícilmente cambiarán mucho, por lo que son muy adecuados para " persistentes ".

Por las razones anteriores, decidí resumir mi serie de artículos en un documento PDF / HTML / WORD. Para ser sincero, me llevó mucho tiempo crear dicho documento .

Método de adquisición de documentos: reenvío + atención, el editor de cartas privadas entre bastidores [documentación] se puede obtener de forma gratuita.

 

 

Método de adquisición de documentos: reenvío + atención, el editor de cartas privadas entre bastidores [documentación] se puede obtener de forma gratuita.

 

 

 

 

238 artículos originales publicados · Me gusta 68 · Visitas 30,000+

Supongo que te gusta

Origin blog.csdn.net/qq_45401061/article/details/104907907
Recomendado
Clasificación