Técnicas de programación
Algoritmos voraces
Los algoritmos voraces o de tipo greedy son aquellos que resuelven problemas de optimización, construyen la solución óptima paso a paso eligiendo la componente de la solución
(sin revisar elecciones previas de componentes).
Su esquema general es el siguiente:
Algoritmos voraces sobre grafos
Árbol generador de costo mínimo (Algoritmo de Prim)
Sea un grafo conexo no dirigido con un costo no negativo asociado a cada arista:
es un árbol generador si el grafo es conexo y no contiene ciclos.
Su costo total es la suma de costos de sus aristas. El algoritmo busca cuyo costo sea mínimo.
Para resolver este problema, el algoritmo de Prim recibe un grafo y un vértice origen, parte desde el vértice origen y se va extendiendo el tendido a partir de ese vértice. Se selecciona la arista de menor costo capaz de incorporar un nuevo vértice, se devuelve un conjunto de aristas seleccionadas.
Camino de costo mínimo (Algoritmo de Dijkstra)
Sea un grafo dirigido con costos no negativos en sus aristas, y sea uno de sus vértices:
Se busca obtener los caminos de menor costo desde hacia cada uno de los demás vértices.
Para resolver este problema, el algoritmo de Dijkstra realiza una secuencia de pasos, donde es el número de vértices. Este recibe un vértice y un grafo. En cada paso “aprende” el camino de menor costo desde a un nuevo vértice, pintandolo de color (finalizado). Tras esos pasos, conoce los costos de los caminos de menor costo a cada uno de los vértices. Devuelve un arreglo donde es el camino de menor costo desde al vértice .
Backtracking
El backtracking es una técnica de programación que se utiliza al no poder resolver un problema de forma voraz (no hay criterio de selección óptimo).
Se basa en la idea de explorar todas las soluciones posibles y quedarnos con la mejor de ellas. Si se elige un fragmento de solución que no es óptimo, se descarta y se vuelve atrás (backtrack) para probar otra opción.
Programación dinámica
La programación dinámica es un método para transformar una definción recursiva en iterativa mediante una tabla de valores.
Ejemplo: Secuencia de Fibonacci