Un algoritmo es una secuencia ordenada finita de instrucciones (pasos) para resolver un problema .
Digamos que tiene una colección de números y necesita saber el valor máximo.
Un algoritmo simple e ingenuo para resolver este problema podría ser:
- Dado un laberinto cuadrado, cada entrada en el laberinto es una celda abierta 'O' o una pared 'X'. Una rata puede viajar a sus ubicaciones adyacentes (izquierda, derecha, arriba y abajo), pero para llegar a una celda, debe estar abierta. Dadas las ubicaciones de las ratas, ¿puedes averiguar si todas las ratas pueden alcanzar a las demás?
- Supongamos que tenemos el recorrido de preorden de un árbol de expresión. ¿El árbol que creamos con este recorrido es único?
- ¿Cuáles son las principales diferencias, con ejemplos, entre un algoritmo de aprendizaje profundo y un algoritmo de aprendizaje de refuerzo?
- Si tengo una matriz compuesta de cadenas de dígitos y guiones, ¿cómo puedo usar Javascript para agregar la suma de cada dígito mientras omito los guiones?
- Dado un volumen que consiste en un número de ubicaciones dentro de un espacio tridimensional definido, y a cada una de estas ubicaciones se le asigna algún número, ¿hay alguna métrica obvia que se pueda aplicar que mida la complejidad de la distribución de las mediciones?
- Tome el primer elemento de esta colección. Llámalo max ;
- Repetir sobre cada elemento de la colección:
- Si item > max , entonces ponga valor en max;
- Retorno max .
Cuando termina de iterar, tiene el valor máximo en max .
Más formalmente, podemos escribir algo como:
función getMax (valores: Colección): max max entonces: max <- elemento retorno max
Acabamos de escribir un pseudocódigo : una forma de describir los pasos exactos del algoritmo.
Tenga en cuenta que no existe una sintaxis única para escribir pseudocódigos, pero podemos usar algunos estilos y convenciones comunes.
Básicamente, cuando escribe un programa, está implementando un algoritmo (o algunos algoritmos) con un lenguaje de programación.
¿Por qué implementar? Porque un algoritmo es un concepto abstracto. Es una descripción de lo que debe hacerse (recuerde el pseudocódigo). Su código es la implementación real del algoritmo.
Dicho esto, otra cosa interesante es que podría haber diferentes implementaciones del mismo algoritmo.
Tenemos algunas técnicas de diseño de algoritmos que se adaptan mejor a tipos específicos de problemas. Algunos de ellos son:
- Codicioso;
- Divide y conquistaras;
- Programación dinámica;
- Retroceso
También hay diferentes algoritmos famosos para resolver problemas comunes, como:
- Clasificación;
- Caminos más cortos;
- Planificación;
- Fraccionamiento;
- La subsecuencia común más larga;
- …
¿Por qué necesitamos diferentes algoritmos para los mismos problemas?
Porque estos algoritmos pueden diferir en su costo (o complejidad ).
El costo de un algoritmo se puede definir como su eficiencia, en términos de velocidad y espacio utilizado.
Para determinar la complejidad de un algoritmo podemos usar la notación asintótica .
Esta herramienta es increíble, porque te dice con precisión si un algoritmo es eficiente o no.
Entonces, generalmente, diferentes algoritmos para diferentes situaciones.
Hay muchas cosas que decir sobre algoritmos (y estructuras de datos). Es un campo interesante e iluminador.