Seis algoritmos que los programadores deberían dominar, ¿los conoces?

Para un excelente programador, cuando se enfrenta a los requisitos de un proyecto, definitivamente pensará en el método más adecuado para resolver el problema. Si elige el algoritmo correcto, tendrá el efecto de conseguirlo. el doble de resultado con la mitad de esfuerzo. Por el contrario, puede hacer que el programa se ejecute de manera ineficiente y sea propenso a errores. Por tanto, estar familiarizado con los algoritmos utilizados habitualmente es el requisito más básico para un buen programador.

Entonces, ¿cuáles son los algoritmos más utilizados? En términos generales, los algoritmos involucrados en nuestro trabajo diario generalmente se dividen en los siguientes tipos: divide y vencerás, codicioso, iteración, enumeración, retroceso y programación dinámica. Introduzcamos estos algoritmos uno por uno.

1. Algoritmo divide y vencerás

El algoritmo divide y vencerás, como su nombre indica, consiste en dividir un problema grande que es difícil de resolver directamente en una serie de problemas idénticos más pequeños para que puedan resolverse individualmente y dividir y conquistar.

El algoritmo de divide y vencerás generalmente se divide en tres partes: descomponer el problema, resolver el problema y fusionar soluciones.

El algoritmo divide y vencerás es adecuado para situaciones en las que el tamaño del problema se puede reducir hasta cierto punto y se puede resolver, y los subproblemas son independientes entre sí y las soluciones Los resultados obtenidos se pueden combinar en la solución del problema.

Un ejemplo típico es encontrar el valor máximo en una matriz desordenada, es decir, se puede utilizar el algoritmo de divide y vencerás. El ejemplo es el siguiente:

def pidAndConquer. (arr,leftIndex,rightIndex):

if(rightIndex==leftIndex+1 || rightIndex==leftIndex){

return Math.max(arr[leftIndex],arr[ rightIndex]);

}

int mid=(leftIndex+rightIndex)/2;

int leftMax=pidAndConquer(arr,leftIndex,mid); /p>

int rightMax=pidAndConquer( arr,mid,rightIndex);

return Math.max(leftMax,rightMax

2. Algoritmo codicioso

;

El algoritmo codicioso se refiere a resolver el problema. Siempre tome la mejor decisión en este momento. En otras palabras, sin considerar la solución óptima general, lo que hizo fue solo una solución óptima local en cierto sentido.

La idea básica del algoritmo codicioso es dividir el problema en varios subproblemas, luego resolver cada subproblema para obtener la solución óptima local del subproblema y finalmente fusionar el óptimo. soluciones de los subproblemas al problema original Una solución. Una cosa a tener en cuenta aquí es que el algoritmo codicioso no necesariamente obtiene la solución óptima global. Este defecto hace que el algoritmo codicioso sea menos aplicable. Su mayor uso es equilibrar la eficiencia del algoritmo y la aplicación del resultado final. De todos modos, después de tantos pasos, definitivamente te dará un valor. Si es óptimo, entonces ya no puedo controlarlo. Es como ir al mercado húmedo a comprar algunas verduras. Puedes comparar precios repetidamente antes de comprarlas, o puedes comprar primero lo que veas en oferta, en resumen, el resultado final es que puedes volver a comprar las verduras, pero tú. Puede que no haya gastado demasiado.

Un ejemplo típico es el problema de la mochila parcial: hay n objetos, el peso del i-ésimo objeto es Wi y el valor es Vi. Deje que el valor total sea lo más alto posible sin el total. peso superior a C. Sólo se puede retirar una parte de cada objeto y el valor y el peso se calculan proporcionalmente.

La estrategia codiciosa es elegir la más rentable cada vez, y el juicio no excederá C.

3. Algoritmo iterativo

El método iterativo, también conocido como método de lanzamiento, es un proceso que utiliza continuamente el valor anterior de una variable para derivar recursivamente nuevos valores.

El algoritmo iterativo es un método básico de uso de computadoras para resolver problemas. Aprovecha la rápida velocidad de computación de la computadora y su idoneidad para operaciones repetitivas, lo que le permite ejecutar repetidamente un conjunto de instrucciones (o ciertos pasos), cada vez que ejecuta el conjunto. de instrucciones. (o estos pasos), se deriva un nuevo valor a partir del valor original de la variable. Finalmente obtenga el resultado del problema.

El algoritmo iterativo es adecuado para problemas en los que las variables de los parámetros de entrada son determinadas en cada paso y el valor anterior se puede utilizar como parámetro de entrada para el siguiente paso.

Un ejemplo típico es utilizar un algoritmo iterativo para calcular la secuencia de Fibonacci.

4. Algoritmo de enumeración

El algoritmo de enumeración es el algoritmo más utilizado en nuestra vida diaria. Su idea central es enumerar todas las posibilidades. La esencia del método de enumeración es buscar la solución correcta entre todas las respuestas candidatas.

El algoritmo de enumeración es adecuado para situaciones en las que el número de respuestas candidatas es fijo.

Los ejemplos típicos incluyen el problema del dinero de las gallinas. Hay 5 gallos, 3 gallinas y 1 polluelo. Encuentra todas las soluciones posibles para m dinero y n gallinas. Se puede utilizar un bucle triple para enumerar todos los casos. El código es el siguiente:

5. Algoritmo de retroceso

El algoritmo de retroceso es un proceso de intento de búsqueda similar a la enumeración. Principalmente busca la solución al problema durante el intento de búsqueda. Cuando descubra que ya no está satisfecho Al resolver las condiciones, "retroceda" y pruebe otros caminos.

Muchos problemas complejos y de gran escala pueden utilizar el método de retroceso, conocido como "método universal de resolución de problemas".

Un ejemplo típico es el algoritmo de las 8 reinas. Coloca ocho reinas en un ajedrez de 88 casillas de manera que no puedan atacarse entre sí, es decir, no pueden estar dos reinas en la misma fila, en la misma columna o en la misma diagonal ¿Cuántas formas hay de colocarlas?

El método de retroceso es el método más clásico para resolver el Problema de la Reina. La idea del algoritmo es que si una reina elige una posición, entonces la posición de la siguiente reina está restringida. La siguiente reina debe seguir buscando hasta encontrar una posición segura. Si no la encuentra, debe irse. volver a la reina anterior, entonces se debe buscar la reina anterior. Se cambiará la posición de una reina y la recursividad continuará hasta que se hayan citado todas las situaciones.

6. Algoritmo de programación dinámica

El proceso de programación dinámica es: cada decisión depende del estado actual y luego provoca una transición de estado. Una secuencia de decisiones se genera en un estado cambiante, por lo que este proceso de toma de decisiones de optimización de múltiples etapas para resolver problemas se denomina programación dinámica.

El algoritmo de programación dinámica es adecuado para problemas donde cuando se da el estado de una determinada etapa, el desarrollo del proceso después de esta etapa no se ve afectado por los estados de las etapas anteriores, es decir, no hay efecto secundario.

Un ejemplo típico es el problema de la mochila. Dada la capacidad de la mochila y el peso y valor de los artículos, se requiere que el valor de los artículos en la mochila sea el mayor.