Los 10 mejores algoritmos de programación que los programadores deben conocer

Algoritmo (Algoritmo) se refiere a la descripción precisa y completa del esquema de resolución de problemas. Es una serie de instrucciones claras para resolver el problema. El algoritmo representa un método sistemático para describir el mecanismo de estrategia para resolver el problema. En otras palabras, es posible obtener la salida requerida dentro de un tiempo limitado para una determinada entrada estándar. Si un algoritmo tiene fallas o no es adecuado para un determinado problema, la ejecución de este algoritmo no resolverá el problema. Diferentes algoritmos pueden usar diferentes tiempos, espacios o eficiencia para realizar la misma tarea. Los pros y los contras de un algoritmo se pueden medir por la complejidad del espacio y la complejidad del tiempo.

Las instrucciones del algoritmo describen un cálculo que puede comenzar desde un estado inicial y una entrada inicial (posiblemente vacía) cuando se ejecuta, pasar por una serie de estados finitos y claramente definidos y finalmente producir una salida y detenerse en un estado final. La transición de un estado a otro no es necesariamente segura. Algunos algoritmos, incluidos los de aleatorización, incluyen algunas entradas aleatorias.

Algoritmo 1: algoritmo de clasificación rápida

La clasificación rápida es un algoritmo de clasificación desarrollado por Tony Hall. En promedio, se necesitan comparaciones Ο (n log n) para ordenar n elementos. En el peor de los casos, se requieren comparaciones Ο (n2), pero esta situación no es común. De hecho, la ordenación rápida suele ser significativamente más rápida que otros algoritmos Ο (n log n) porque su bucle interno se puede implementar de manera eficiente en la mayoría de las arquitecturas.

La clasificación rápida utiliza una estrategia de divide y vencerás (divide y vencerás) para dividir una lista en dos sublistas.

Pasos del algoritmo:

1 Elija un elemento de la secuencia y llámelo "pivote",

2 Reordene la secuencia, todos los elementos menores que el valor de referencia se colocan delante de la referencia y todos los elementos mayores que el valor de referencia se colocan detrás de la referencia (el mismo número puede ir a cualquier lado). Una vez que esta partición sale, el punto de referencia se encuentra en el medio de la secuencia. Esto se llama operación de partición.

3 Ordene de forma recursiva las subsecuencias de elementos menores que el valor de referencia y las subsecuencias de elementos mayores que el valor de referencia.

El caso inferior de recursividad es que el tamaño de la secuencia es cero o uno, es decir, siempre se ha ordenado. Aunque ha sido recursivo, este algoritmo siempre saldrá, porque en cada iteración pondrá al menos un elemento en su última posición.


Algoritmo 2: algoritmo de clasificación de montón

Heapsort se refiere a un algoritmo de clasificación diseñado utilizando la estructura de datos del montón. El apilamiento es una estructura que se aproxima a un árbol binario completo y también satisface la naturaleza del apilamiento: es decir, la clave o índice del nodo hijo siempre es menor (o mayor) que su nodo padre.

La complejidad de tiempo promedio de la ordenación del montón es Ο (nlogn).

Pasos del algoritmo:

Crear un montón H [0..n-1]

Intercambiar cabeza (máximo) y cola

3. Reduzca el tamaño del montón en 1 y llame a shift_down (0), el propósito es ajustar los datos superiores de la nueva matriz a la posición correspondiente

4. Repita el paso 2 hasta que el tamaño de la pila sea 1

Algoritmo 3: combinación de ordenación

La clasificación por combinación (clasificación por combinación, traducción de Taiwán: clasificación por combinación) es un algoritmo de clasificación eficaz basado en la operación de combinación. Este algoritmo es una aplicación muy típica de Divide and Conquer.

Pasos del algoritmo:

1. Solicite espacio para que su tamaño sea la suma de dos secuencias ordenadas. Este espacio se utiliza para almacenar la secuencia combinada

2. Establezca dos punteros, las posiciones iniciales son las posiciones iniciales de las dos secuencias ordenadas

3. Compare los elementos señalados por los dos punteros, seleccione un elemento relativamente pequeño para colocarlo en el espacio de combinación y mueva el puntero a la siguiente posición

4. Repita el paso 3 hasta que un puntero llegue al final de la secuencia.

5. Copie todos los elementos restantes de otra secuencia directamente al final de la secuencia combinada

Algoritmo 4: algoritmo de búsqueda binaria El algoritmo de búsqueda
binaria es un algoritmo de búsqueda para encontrar un elemento específico en una matriz ordenada. El proceso de búsqueda comienza desde el elemento intermedio de la matriz. Si el elemento intermedio resulta ser el elemento que se va a buscar, el proceso de búsqueda finaliza; si un elemento en particular es mayor o menor que el elemento intermedio, busque en la mitad de la matriz que sea mayor o menor que el elemento intermedio Y comience a comparar desde el elemento del medio como al principio. Si la matriz está vacía en un determinado paso, significa que no se puede encontrar. Este algoritmo de búsqueda reduce el rango de búsqueda a la mitad con cada comparación. La búsqueda binaria reduce el área de búsqueda a la mitad cada vez, y la complejidad del tiempo es Ο (logn).

Algoritmo cinco: BFPRT (algoritmo de búsqueda lineal)

El problema resuelto por el algoritmo BFPRT es muy clásico, es decir, seleccionar el k-ésimo elemento más grande (k-ésimo el más pequeño) de una secuencia de n elementos. A través de un análisis inteligente, BFPRT puede asegurar que sigue siendo una complejidad de tiempo lineal en el peor de los casos. La idea de este algoritmo es similar a la del tipo rápido, por supuesto, para que el algoritmo aún alcance la complejidad temporal de o (n) en el peor de los casos, cinco autores de algoritmos han realizado un proceso delicado.

Pasos del algoritmo:

1. Divida n elementos en grupos de 5 (límite superior).

2. Tome la mediana de cada grupo y use cualquier método de clasificación, como la clasificación por inserción.

3. Llame de forma recursiva al algoritmo de selección para encontrar la mediana de todas las medianas en el paso anterior y configúrelo en x. En el caso de un número par de medianas, configúrelo para seleccionar la más pequeña.

4. Utilice x para dividir la matriz, establezca el número menor o igual que x como k, y el número mayor que x como nk.

5. Si i == k, devuelve x, si i <k, encuentra recursivamente el i-ésimo elemento más pequeño entre los elementos menores que x, si i> k, encuentra recursivamente el i-ésimo elemento más pequeño entre los elementos mayores que x.

Condición de terminación: cuando n = 1, se devuelve el elemento pequeño i.
Algoritmo 6: DFS (primera búsqueda en profundidad)

Depth-First-Search es una especie de algoritmo de búsqueda. Atraviesa los nodos del árbol a lo largo de la profundidad del árbol, buscando las ramas del árbol lo más profundo posible. Cuando se hayan explorado todos los bordes del nodo v, la búsqueda retrocederá hasta el nodo inicial del borde donde se encuentra el nodo v. Este proceso continúa hasta que se hayan encontrado todos los nodos accesibles desde el nodo de origen. Si todavía hay nodos sin descubrir, seleccione uno de ellos como nodo de origen y repita el proceso anterior. Todo el proceso se repite hasta que se visitan todos los nodos. DFS es una búsqueda ciega.

La búsqueda en profundidad es un algoritmo clásico en la teoría de grafos. El algoritmo de búsqueda en profundidad puede generar la tabla de clasificación topológica correspondiente del gráfico de destino. La tabla de clasificación topológica puede resolver convenientemente muchos problemas relacionados con la teoría de grafos, como el problema de la ruta máxima. La estructura de datos del montón se usa generalmente para ayudar a la realización del algoritmo DFS.

Pasos del algoritmo del gráfico transversal de profundidad primero:

1. Visite el vértice v;

2. A partir de los puntos vecinos no visitados de v, realice un recorrido en profundidad en el gráfico, hasta que se visiten los vértices del gráfico que tienen una ruta av;

3. Si hay vértices en el gráfico que no se han visitado en este momento, comenzando desde un vértice no visitado, se repite el recorrido en profundidad hasta que se hayan visitado todos los vértices del gráfico.

La descripción anterior puede ser más abstracta, por ejemplo:

Después de que DFS visita un cierto vértice inicial v en el gráfico, comienza desde vy visita cualquiera de sus vértices adyacentes w1; luego comienza desde w1 para visitar el vértice w2 que está adyacente a w1 pero no ha sido visitado; luego comienza desde w2 para continuar Visitas similares ... continúan de esta manera hasta llegar al vértice u donde se han visitado todos los vértices adyacentes.

Luego, retroceda un paso y vaya al vértice que acaba de visitar la vez anterior para ver si hay otros vértices adyacentes que no hayan sido visitados. Si lo hay, visite este vértice y luego proceda desde este vértice para realizar una visita similar a la anterior; si no, retroceda un paso para buscar. Repita el proceso anterior hasta que se hayan visitado todos los vértices del gráfico conectado.
Algoritmo 7: BFS (primera búsqueda en amplitud)

Breadth-First-Search es un algoritmo de búsqueda de gráficos. En pocas palabras, BFS comienza desde el nodo raíz y atraviesa los nodos del árbol (gráfico) a lo largo del ancho del árbol (gráfico). Si se visitan todos los nodos, el algoritmo se detiene. BFS también es una búsqueda ciega. La estructura de datos de la cola se utiliza generalmente para ayudar en la realización del algoritmo BFS.

Pasos del algoritmo:

1. Primero ponga el nodo raíz en la cola.

2. Tome el primer nodo de la cola y verifique si es el objetivo.

Si se encuentra el objetivo, la búsqueda finaliza y se devuelve el resultado.

De lo contrario, todos sus nodos secundarios directos que no se hayan verificado se agregan a la cola.

3. Si la cola está vacía, significa que se ha verificado toda la imagen, es decir, no hay ningún objetivo para buscar en la imagen. Finalice la búsqueda y devuelva "No se encontró ningún objetivo".

4. Repita el paso 2.

Algoritmo ocho: algoritmo de Dijkstra

El algoritmo de Dijkstra (algoritmo de Dijkstra) fue propuesto por el informático holandés Azchel Dijkstra. El algoritmo de Dixie utiliza la búsqueda de amplitud primero para resolver el problema de la ruta más corta de una sola fuente de un gráfico dirigido con pesos no negativos. El algoritmo finalmente obtiene un árbol de ruta más corto. Este algoritmo se utiliza a menudo en algoritmos de enrutamiento o como submódulo de otros algoritmos de gráficos.

La entrada del algoritmo incluye un gráfico dirigido ponderado G y un vértice fuente S en G. Sea V el conjunto de todos los vértices de G. Los bordes de cada gráfico son pares ordenados de elementos formados por dos vértices. (u, v) significa que hay un camino que conecta desde el vértice u hasta v. Usamos E para denotar el conjunto de todos los bordes en G, y el peso del borde está definido por la función de peso w: E → [0, ∞]. Por lo tanto, w (u, v) es el peso no negativo del vértice u al vértice v. El peso de un borde se puede imaginar como la distancia entre dos vértices. El peso del camino entre dos puntos cualesquiera es la suma de los pesos de todos los bordes del camino. Sabiendo que hay vértices syt en V, el algoritmo de Dijkstra puede encontrar la ruta con el peso más bajo de sa t (por ejemplo, la ruta más corta). Este algoritmo también puede encontrar el camino más corto desde un vértice s hasta cualquier otro vértice en un gráfico. Para gráficos dirigidos sin pesos negativos, el algoritmo de Dijkstra es el algoritmo de ruta más corta de fuente única más rápido que se conoce actualmente.

Pasos del algoritmo:

1. Tiempo inicial S = {V0}, T = {vértices en reposo}, el valor de la distancia correspondiente a los vértices en T

Si hay <v0, vi>, d (V0, Vi) es el peso en el arco <v0, vi>

Si no hay <v0, vi>, d (V0, Vi) es ∞

2. Seleccione un vértice W con el valor de distancia más pequeño desde T y no en S, y agregue S

3. Modifique el valor de la distancia de los vértices en el T restante: Si se agrega W como el vértice medio, el valor de la distancia de V0 a Vi se acorta, luego modifique este valor de distancia

Repita los pasos 2 y 3 anteriores hasta que todos los vértices estén incluidos en S, es decir, W = Vi

Algoritmo nueve: algoritmo de programación dinámica

La programación dinámica es un método utilizado en matemáticas, ciencias de la computación y economía para resolver problemas complejos mediante la descomposición del problema original en subproblemas relativamente simples. La programación dinámica a menudo es adecuada para problemas con subproblemas superpuestos y subestructuras óptimas El método de programación dinámica que consume mucho tiempo es a menudo mucho menor que el de la solución ingenua.

La idea básica detrás de la programación dinámica es muy simple. En términos generales, si queremos resolver un problema dado, necesitamos resolver sus diferentes partes (es decir, subproblemas) y luego fusionar las soluciones de los subproblemas para obtener la solución del problema original. Por lo general, muchos subproblemas son muy similares. Por esta razón, el método de programación dinámica intenta resolver cada subproblema solo una vez, reduciendo así la cantidad de cálculo: una vez que se ha calculado la solución de un problema de estator dado, se almacena en la memoria para que el mismo subproblema sea necesario la próxima vez. Verifique directamente la tabla al resolver. Este enfoque es particularmente útil cuando el número de subpreguntas repetidas aumenta exponencialmente con respecto al tamaño de la entrada.

El problema más clásico de la programación dinámica es el problema de la mochila.

Pasos del algoritmo:

1. Propiedades óptimas de la subestructura. Si la solución del subproblema contenido en la solución óptima del problema también es óptima, decimos que el problema tiene la propiedad de subestructura óptima (es decir, satisface el principio de optimización). Las propiedades de la subestructura óptima proporcionan pistas importantes para que el algoritmo de programación dinámica resuelva el problema.

2. La naturaleza superpuesta de los subproblemas. La naturaleza superpuesta de los subproblemas significa que cuando se usa el algoritmo recursivo para resolver el problema de arriba a abajo, los subproblemas que se generan cada vez no siempre son problemas nuevos, y algunos subproblemas se repetirán varias veces. El algoritmo de programación dinámica aprovecha la naturaleza superpuesta de este subproblema. Calcula cada subproblema solo una vez, y luego guarda sus resultados de cálculo en una tabla. Cuando los subproblemas calculados necesitan ser calculados nuevamente, solo en la tabla. Simplemente verifique los resultados para obtener una mayor eficiencia.
Algoritmo diez: algoritmo de clasificación Naive Bayes

El algoritmo de clasificación ingenuo de Bayes es un algoritmo de clasificación probabilístico simple basado en el teorema de Bayes. La base de la clasificación bayesiana es el razonamiento probabilístico, que es cómo completar tareas de razonamiento y toma de decisiones cuando la existencia de diversas condiciones es incierta y solo se conoce la probabilidad de que ocurran. El razonamiento probabilístico corresponde al razonamiento determinista. El clasificador ingenuo de Bayes se basa en la hipótesis independiente, es decir, se supone que cada característica de la muestra no está relacionada con otras características.

El clasificador Naive Bayes se basa en un modelo de probabilidad natural preciso para obtener muy buenos resultados de clasificación en un conjunto de muestras de aprendizaje supervisado. En muchas aplicaciones prácticas, la estimación de parámetros del modelo Naive Bayes utiliza el método de estimación de máxima verosimilitud, en otras palabras, el modelo Naive Bayes puede funcionar sin probabilidad bayesiana ni ningún modelo bayesiano.

Clasificación rápida, clasificación de combinación, clasificación de pila

Entonces, ¿cómo elegir en la aplicación real? Existen estos criterios de selección:

    Si n es menor, use la ordenación por inserción y la ordenación por selección simple. Dado que la clasificación por inserción directa requiere más operaciones de movimiento de registros que la clasificación por selección simple, es mejor utilizar la clasificación por selección simple cuando la cantidad de información en el registro en sí es relativamente grande.
    Si la secuencia que se va a ordenar está básicamente en orden, se puede usar la ordenación por inserción directa o la ordenación por burbujas.
    Si n es grande, se debe usar el algoritmo con la complejidad de tiempo más baja, como la ordenación rápida, la ordenación por montones o la combinación

        En términos de subdivisión, cuando los datos se distribuyen aleatoriamente, la clasificación rápida es la mejor (esto está relacionado con la optimización de hardware de la clasificación rápida, como se mencionó en la publicación anterior del blog). La
        fila del montón solo necesita un espacio auxiliar y no habrá clasificación rápida En los casos
        graves , tanto la clasificación rápida como la clasificación por montón son inestables. Si se requiere estabilidad, se puede usar la combinación. También puede combinar la clasificación por inserción directa y la combinación. Primero use la inserción directa para obtener fragmentos ordenados y luego fusionar, de modo que el resultado obtenido también sea estable Porque la inserción directa es estable
 

Supongo que te gusta

Origin blog.csdn.net/wangletiancsdn/article/details/105163503
Recomendado
Clasificación