SlideShare una empresa de Scribd logo
TEMA 5: Estrategias para
construir algoritmos
OBJETIVO: El alumno conocerá y aplicará las principales
técnicas para construir algoritmos, así como la recursividad
como estrategia para desarrollar algoritmos eficientes.
5.1 Aspectos generales de la construcción de
algoritmos
5.1 Estrategias de diseño
Las estrategias de diseño establecen la forma en la que se modela el
problema que se va a resolver
Saber cual es la estrategia apropiada para cada problema depende de
factores como los datos que se trabajan, las entradas y salidas
esperadas
5.1.1 Top-down
Consiste en establecer una serie de etapas, niveles o jerarquías
iniciando desde los aspectos más generales hasta llegar a los más
específicos.
Se busca establecer una relación entre las etapas de la solución del
problema.
Puede ser mediante módulos conectados entre si, de entradas y salidas
de información o de datos abstractos que contienen otros.
5.1.1 Top-down
Esta técnica tiene los siguientes aspectos:
Simplificación del problema y sus módulos haciendo una
descomposición.
Las diferentes partes del problema pueden ser programadas de modo
independiente e incluso por diferentes personas.
El programa final queda estructurado en forma de bloque o módulos lo
que hace más sencilla su lectura y mantenimiento.
5.1.2 Bottom-Up
Parte desde los módulos particulares o específicos que son parte de
la solución general de un problema.
Se suele utilizar cuando ya se elaboró el diseño de una solución y se
va a realizar la implementación de la misma.
5.1.2 Bottom-Up
Si el diseño de la solución se realiza siguiendo este modelo, puede
ser complicado ya que no se tiene un panorama general del
problema completo.
Se utiliza cuando el punto de partida es simple y
después se agregan nuevas funcionalidades a un
sistema
5.1.3 Problemas de Optimización
Un problema de optimización consiste en minimizar o maximizar el
valor de una variable.
La variable que se desea minimizar o maximizar debe ser expresada
como función de otra de las variables relacionadas en el problema.
5.1.3 Problemas de Optimización
En un problema de optimización no solo se busca una solución, sino
que se busca "la mejor" de todas.
En los problemas de optimización, la dinámica de los algoritmos busca
tomar una serie de decisiones, cuyo efecto general es reducir o
maximizar un recurso (una variable) especifico
(Mínimo costo - Máximo beneficio)
5.2 Búsqueda exhaustiva o fuerza bruta
5.2.1 Fuerza Bruta - Definición
Consiste en verificar todas las posibles soluciones a un problema hasta
encontrar aquella o aquellas que cumplan con el propósito de resolver
el problema.
Es la forma de aproximación más simple para resolver un problema.
5.2.2 Fuerza Bruta – Ventajas y Desventajas
VENTAJAS
Simplicidad en los algoritmos
Aplicable a diferentes tipos de problemas
DESVENTAJAS
Carece de eficiencia en muchos casos.
Funcional para instancias relativamente
pequeñas de los problemas que se resuelven
5.2.2 Fuerza Bruta – Ejemplos
Buscar los divisores de un número
✓ Verificar si un número es primo.
Dado un conjunto de números, encontrar la suma máxima entre ellos
Dada una cierta longitud y un conjunto de caracteres, encontrar un
password.
Búsqueda lineal
3.3 Algoritmos ávidos (Greedy)
5.3.1 Algoritmos Ávidos - Definición
Un algoritmo ávido es aquel que, para resolver un determinado
problema, elige la mejor opción en cada paso local (de manera
directa) con la esperanza de llegar a una solución general óptima.
Este esquema algorítmico plantea pocas dificultades al ejecutarse y
comprobar su funcionamiento.
5.3.1 Algoritmos Ávidos - Definición
Consiste en tomar las decisiones sucesivamente, de modo que cada
decisión individual sea la mejor de acuerdo con algún criterio “a corto
plazo” cuya evaluación no sea demasiado costosa.
Una vez tomada una decisión, no se podrá revertir, ni siquiera si más
adelante se hace obvio que no fue una buena.
5.3.2 Algoritmos Ávidos – Forma general
1. Establecer el problema en función de decisiones
directas de tal forma que cada decisión resulte en un
nuevo subproblema a resolver.
2. Mostrar que siempre hay una solución al problema
original a partir de la decisión que tome la etapa actual.
3. Demostrar que el subproblema obtenido a partir de la
primer solución proporcionada con el algoritmo
“greedy” aún tiene una solución al problema.
5.3.3 Algoritmos Ávidos – Ejemplos
La estrategia en la que trabaja un algoritmo greedy es top-down.
Los algoritmos de tipo “GREEDY” no necesariamente obtienen la
solución óptima.
Algunos ejemplos típicos de problemas conocidos que se resuelven
utilizando un algoritmo ávido son:
➢ Problema del cambio de monedas.
➢ Problema de la mochila.
5.3.3 Algoritmos Ávidos – Ejemplos
Problema del cambio de monedas
Consiste en descomponer una cantidad n en el menor numero de
monedas.
El enfoque de resolución de este problema utilizando un algoritmo de
tipo greedy es tomar siempre la moneda de más alta denominación
que no rebase la cantidad n.
5.3.3 Algoritmos Ávidos – Ejemplos
Ejemplo: Pesos Mexicanos {10,5,2,1}
a) $24: {10,10,2,2}
b)$15: {10,5}
Ejemplo: Otra moneda {11,5,1}
$15: { 11, 1, 1, 1, 1}
$18:{11,5,1,1}
5.3.3 Algoritmos Ávidos – Ejemplos
Problema de la mochila
Se tiene una mochila con una capacidad de n kilogramos y se tiene un
conjunto de objetos con un peso y un valor económico cada uno.
El objetivo es llevar en la mochila el mayor valor posible.
Mochila de 100 kg … ¿Qué objetos seleccionar?
Peso 10 20 30 40 50
Costo 20 10 65 40 60
5.3.3 Algoritmos Ávidos – Ejemplos
 Primero el más ligero
Peso = 10 + 20 + 30 + 40 = 100 kg
Valor = 20 + 10 + 65 + 40 = 135
 Primero el más valioso
Peso = 30 + 50 + 10 = 90kg
Valor = 65 + 60 + 20 = 145
 Primero el que tenga mas valor por unidad de peso
Peso = 30 + 10 + 50 = 90kg
Valor = 65 + 20 + 60 = 145
Peso 10 20 30 40 50
Costo 20 10 65 40 60
5.3.3 Algoritmos Ávidos – Ejemplos
Problema de la mochila fraccional
En esta variante del problema, se puede tomar “fracciones” de los
objetos de tal manera que siempre se llena la mochila a su máxima
capacidad
Peso 10 20 30 40 50
Costo 20 10 65 40 60
Valor x
unidad 2 0.5 2.1666 1 1.2
5.3.3 Algoritmos Ávidos – Ejemplos
 Primero el más ligero
Peso = 10 + 20 + 30 + 40 +10 ( de 50)= 110 kg
Valor = 20 + 10 + 65 + 40 + 12 = 147
 Primero el más valioso
Peso = 30 + 50 + 30 (de 40) = 110kg
Valor = 65 + 60 + 30 = 155
 Primero el que tenga mas valor por unidad de peso
Peso = 30 + 10 + 50 + 20( de 40)= 110kg
Valor = 65 + 20 + 60 + 20= 165
Peso 10 20 30 40 50
Costo 20 10 65 40 60
Valor x
unidad
2 0.5 2.1666 1 1.2
5.4 Divide y vencerás
5.4.1 Divide y vencerás - Generalidades
Además de ser una estrategia para construir algoritmos, es una
técnica que suele ser considerada para resolver problemas en general.
En el campo de los algoritmos consiste en resolver un problema a
partir de la solución de sub-problemas del mismo tipo pero de menor
tamaño.
5.4.2 Divide y vencerás - Descripción
La idea es hacer una división del problema general en sub-problemas del
mismo tipo pero de menor tamaño.
Si después de hacer la “división”, los
sub-problemas son relativamente
grandes, se aplica de nuevo la técnica
tantas veces como sean necesarias hasta alcanzar problemas
suficientemente pequeños para
resolverlos directamente.
5.4.2 Divide y vencerás -Descripción
El resultado del diseño de estos algoritmos suele ser simple (pocas
instrucciones), lo que da lugar a una mejor legibilidad, mayor facilidad
en la depuración y análisis del algoritmo.
La técnica de divide y vencerás suele ir de la mano con la recursividad.
5.4.2 Divide y vencerás - Descripción
Otra consideración importante a la hora de diseñar algoritmos divide y
vencerás, es el reparto de la carga entre los sub-problemas, puesto
que es importante que la división en sub-problemas se haga de la
forma más equilibrada posible.
5.4.3 Divide y vencerás – Forma general
La técnica consiste a grandes rasgos en los siguientes pasos:
1.- Se debe plantear el problema de tal forma que se pueda
descomponer en k sub-problemas del mismo tipo pero de menor
tamaño. A esta parte del procedimiento se le conoce como división.
2.- Se deben resolver los k problemas de manera independiente.
3.- Combinar las soluciones de cada uno de los k problemas para
construir la solución al problema original.
5.4.3 Divide y vencerás – Forma general
5.4.2 Divide y vencerás – Ejemplos
Búsqueda binaria
 Divide: Seleccionar al elemento central en la lista y compararlo con el que
buscamos
 Conquista: Si el valor objetivo es igual al elemento central, se ha encontrado y el
algoritmo termina. En caso de no ser igual se continua de manera recursiva en la
mitad izquierda o derecha.
 Combinar: Los pasos de división y conquista se repiten en la mitad seleccionada
de la lista; hasta que se encuentre la coincidencia o hasta que la lista se reduzca a
un tamaño mínimo y no se pueda dividir más.
5.4.2 Divide y vencerás – Ejemplos
5.4.2 Divide y vencerás – Ejemplos
5.4.2 Divide y vencerás – Ejemplos
Ordenamiento por Intercalación (Mergesort)
Dada una lista desordenada, el procedimiento para ordenarla es el siguiente:
✓ Dividir la lista de n elementos en dos sub-listas de n/2 elementos cada una
✓ Ordenar las dos sub-listas utilizando mergesort
✓ Combinar (intercalar) las dos sub-listas ordenadas para obtener la lista ordenada
final.
5.4.2 Divide y vencerás – Ejemplos
Ordenamiento por Intercalación (Mergesort)
 Divide: Partir recursivamente la lista por la mitad hasta que cada sublista tenga un
solo elemento.
 Conquista: Una vez que las sublistas tienen un solo elemento, se considera que
están ordenadas. Por lo tanto, no es necesario realizar más divisiones y se
considera una solución directa.
 Combina: A medida que se resuelve la recursión, se combinan las sublistas
ordenadas en pares y se fusionan en sublistas más grandes y ordenadas.
5.4.2 Divide y vencerás – Ejemplos
5.4.2 Divide y vencerás – Ejemplos
Algoritmos de ordenamiento
Multiplicación de matrices
Par de puntos más cercano
FFT (Transformada Rápida de Fourier)
Calendarización de actividades.
3.6 BACKTRACK
3.6.1 Backtrack - Descripción
 Backtracking (o búsqueda atrás) es una
estrategia de construcción de algoritmos que
permite realizar una búsqueda sistemática a
través de un espacio de soluciones.
 El objetivo es encontrar soluciones parciales a
medida que progresa el recorrido, estas
soluciones parciales limitan las regiones en las
que se puede encontrar una solución
completa.
3.6.1 Backtrack - Descripción
La búsqueda de solución a un problema no tiene éxito si en alguna
etapa, la solución parcial construida hasta el momento no puede
continuar.
En tal caso, la búsqueda de la solución regresa hacia “atrás” e intenta
otra opción de camino.
3.6.1 Backtrack - Descripción
La construcción de estrategias backtrack es similar a “greedy” ya que
en cada paso se busca un posible camino que conduce a una solución.
La diferencia radica en que en este caso si es posible regresar y buscar
un camino diferente
3.6.1 Backtrack - Descripción
ESTRATEGIA GENERAL
 Comprobar si la solución parcial actual es una solución completa y válida. Si la
solución parcial no es completa o válida, se elige una opción disponible y se toma
una decisión.
 Se realiza una llamada recursiva para continuar explorando con la nueva solución
parcial.
 Después de la llamada recursiva, se deshace la última decisión tomada.
 Se repiten los pasos para todas las opciones disponibles, hasta que se encuentre
una solución o se hayan explorado todas las opciones.
3.6.2 Backtrack - Ejemplos
Recorrer un laberinto hasta encontrar la salida.
✓ No se puede “dividir” el problema
✓ No hay mucha información al inicio
✓ Se requiere tomar decisiones conforme se
avanza o progresa en el recorrido.
✓ Si esas decisiones resultan en un camino
equivocado, se puede regresar e intentar otra
solución
3.6.2 Backtrack - Ejemplos
Problema de la “n” reinas
✓ Dado un tablero de ajedrez de n x n, colocar n reinas de tal
manera que no se puedan ver (que no se maten) entre ellas
✓ No hay mucha información al inicio
✓ Se requiere tomar decisiones sobre la colocación de las reinas.
✓ Si esas decisiones resultan en una solución equivocada, se puede
regresar e intentar otra solución
3.6.2 Backtrack - Ejemplos
3.6.2 Backtrack - Ejemplos
 El problema tiene una estructura de solución incremental, donde la decisión
tomada en cada etapa afecta las opciones disponibles en las etapas siguientes.
 Dado que el problema de las n reinas implica tomar decisiones y descartar
opciones inválidas en cada etapa, es una aplicación adecuada para el algoritmo de
backtrack.
 Permite explorar exhaustivamente todas las posibles soluciones en el espacio de
búsqueda del problema.
 Se van descartando las opciones que no cumplen las restricciones evitando
explorar ramas que no llevarán a una solución válida.
3.6.2 Backtrack - Ejemplos
Sudoku
3.6 Backtrack - Ventajas y desventajas
La mayor ventaja de la estrategia Backtrack es la flexibilidad que
proporciona, ya que dependiendo el enfoque del problema puede
encontrar una o todas las soluciones al problema.
La desventaja es que dependiendo de la dificultad del problema,
puede tomar mucho tiempo en resolverse.
3.6.4 Backtrack - Aplicaciones
Se usa en la implementación de los lenguajes de programación,
principalmente de inteligencia artificial
Se utiliza en análisis sintácticos de los compiladores
Algunos algoritmos de teoría de grafos también se pueden analizar
con este enfoque
5.4 Recursividad
3.4.1 El concepto de Recursividad
Una función recursiva es aquella que hace una llamada a sí misma.
¿Cómo puede un método resolver un problema llamándose a sí
mismo?
La clave está en que esa llamada se hace en un contexto diferente,
que generalmente es más simple que el anterior.
3.4.1 El concepto de Recursividad
La función puede invocarse a sí misma (una o más veces) hasta llegar
a una versión que no requiere una nueva llamada.
Para que una definición recursiva sea válida, la referencia a sí misma
debe ser más simple que el caso previo.
3.4.2 Definición de una función recursiva
Una función recursiva requiere de 2 partes:
1.- Llamada recursiva (a sí misma): En alguna de sus
instrucciones se invoca a sí misma, con un parámetro de
entrada diferente, que implica un caso más simple. Se
hacen nuevas llamadas a la función, cada vez más
próximas al caso base.
2.- Caso Base: Trivial o fin de recursión. Es la parte donde el
problema se resuelve directamente sin una nueva llamada
a sí mismo. Evita la continuación indefinida de la ejecución.
3.4.3 Otros aspectos de Recursividad
La recursión es una potente herramienta que se aplica en la resolución
de problemas.
Las estructuras autoreferenciales son un buen ejemplo de aplicación
de naturaleza recursiva.
3.4.3 Otros aspectos de Recursividad
La contraparte de la recursividad es la “iteración” o la resolución a
través de una fórmula directa.
En las funciones iterativas se resuelve un problema aplicando
procedimientos de solución repetidamente y no se considera la
posible estructura interna del problema.
En algunos casos la función recursiva es más eficiente, en otros la
iterativa es mejor.
3.4.3 Otros aspectos de Recursividad
El diseño de una función recursiva suele ser complicado y algunos de
los problemas que ocurren frecuentemente son:
➢ Creación de una lógica circular que ocasiona que la función no
termine su ejecución.
➢ Error en la definición del caso base.
➢ El número de operaciones crece excesivamente
3.4.4 Recursividad e Inducción matemática
La inducción matemática es la base de la recursividad.
Las demostraciones por inducción, muestran que si se sabe que una
afirmación es cierta para el caso mas pequeño y se puede demostrar
que un caso implica el siguiente, entonces se sabe que la afirmación
es cierta para todos los casos.
Para probar que una definición recursiva es correcta se debe
demostrar por inducción
Tema 5 construccion algoritmos EDA 1.pdf
3.4.5 Ejemplos cotidianos de recursividad
Los archivos de una computadora suelen estar
almacenados en directorios. Los usuarios pueden crear
subdirectorios que almacenan archivos y otros
directorios.
Al descender o ascender por una escalera se realiza un
recorrido recursivo ya que se realiza la misma acción
hasta llegar a un caso base (no más escaleras)
3.4.5 Ejemplos cotidianos de recursividad
Las palabras de los diccionarios se definen utilizando otras palabras.
Al buscar, es posible que no se comprenda la definición y se tenga que
buscar el significado de las palabras que contiene dicha definición.
Como el diccionario es finito, llega un momento en el que se
comprenden todas las palabras, que se caiga en una definición
circular, o que alguna palabra no exista.
3.4.6 Funciones matemáticas recursivas
La suma de los N primeros enteros.
Definición Directa
Definición Recursiva
Caso Base: S(1) = 1
N
N
S
N
S +
−
= )
1
(
)
(
2
)
1
(
)
(
+
=
N
N
N
S
para s(4)…
3.4.6 Funciones matemáticas recursivas
En código
int sumaEnteros(int n){
if (n==1)
return 1;
else
return sumaEnteros(n-1) + n
}
3.4.6 Funciones matemáticas recursivas
Números de Fibonacci: 1,1,2,3,5,8,13,21,34…
Caso Base: fib(0) = 0, fib(1) = 1
)
2
(
)
1
(
)
( −
+
−
= n
fib
n
fib
n
fib
Tema 5 construccion algoritmos EDA 1.pdf
3.4.6 Funciones matemáticas recursivas
En código
int fibonacci(int n){
if (n<=2)
return 1;
else
return fibonacci(n-1)+ fibonacci(n-2)
3.4.6 Funciones matemáticas recursivas
La suma de 2 números.
s𝑢𝑚𝑎 𝑎, 𝑏 = ቐ
𝑎 𝑏 = 0
𝑠𝑢𝑚𝑎 𝑎 − 1, 𝑏 + 1 𝑏 < 0
𝑠𝑢𝑚𝑎 𝑎 + 1, 𝑏 − 1 , 𝑏 > 0
3.4.6 Funciones matemáticas recursivas
En código
int sumaRec (int num1, int num2){
if(num2 == 0)
return num1;
else if(num2 < 0)
return sumaRec(num1-1, num2+1);
else
return sumaRec(num1+1, num2-1);
}
3.4.6 Funciones matemáticas recursivas
En código
int rec (int a, int b){
if(b == 0)
return a;
else if(b < 0)
return rec(a-1, b+1);
else
return rec(a+1, b-1);
}
3.4.6 Funciones matemáticas recursivas
La potencia de un numero (exponente positivo)
𝑝𝑜𝑡𝑒𝑛𝑐𝑖𝑎 𝑏, 𝑛 = ቊ
1 𝑛 = 0
𝑏 ∙ 𝑝𝑜𝑡𝑒𝑛𝑐𝑖𝑎 𝑏, 𝑛 − 1 , 𝑛 > 0
3.4.6 Funciones matemáticas recursivas
Factorial de un número
Iterativo:
Recursivo:
Caso Base: fact(0)=1
))
1
(
)...(
2
)(
1
(
)
( −
−
−
−
= n
n
n
n
n
n
fact
)
1
(
)
( −

= n
fact
n
n
fact

Más contenido relacionado

DOCX
Algoritmo simplex-para-imprimir
DOCX
Teoría de optimización
PPTX
Optimizacion
PPTX
Presentación optimizacion de sistema
PPT
Algoritmos Voraces (Greedy)
PPTX
TECNICAS DE RESOLUCION DE PROBLEMAS
PPTX
Pro no num Prog dinamica
PPT
Investigacion de ope. 1
Algoritmo simplex-para-imprimir
Teoría de optimización
Optimizacion
Presentación optimizacion de sistema
Algoritmos Voraces (Greedy)
TECNICAS DE RESOLUCION DE PROBLEMAS
Pro no num Prog dinamica
Investigacion de ope. 1

Similar a Tema 5 construccion algoritmos EDA 1.pdf (20)

PPTX
U 2 Programacion Lineal.pptx unidad 4 de manufactura
DOCX
guia-unidad-1-teoria-clasica-de-optimizacion (7).docx
PPTX
Programacion lineal
PDF
Programacion lineal
PPTX
Programación dinámica
PPTX
Programación dinámica
PDF
Programacion dinamica
PPTX
Optimización norfreidys suarez
PDF
Trabajo programacion lineal
DOCX
Teoria optimizacion
PDF
Guia 7 solver
PPTX
Como usar solver de excel
PPTX
Optimizacion Angel Peña
PDF
Javierperez teoría de la optimización
PDF
69cfc2bfe8bbf481977db1bf877bde0e1830f102
PDF
Programacion lineal
PPTX
Programacion lineal
DOCX
Estructuras_F_CAT
PDF
Introducción a la optimización heurística en ingeniería
DOCX
Vivi Reinoso
U 2 Programacion Lineal.pptx unidad 4 de manufactura
guia-unidad-1-teoria-clasica-de-optimizacion (7).docx
Programacion lineal
Programacion lineal
Programación dinámica
Programación dinámica
Programacion dinamica
Optimización norfreidys suarez
Trabajo programacion lineal
Teoria optimizacion
Guia 7 solver
Como usar solver de excel
Optimizacion Angel Peña
Javierperez teoría de la optimización
69cfc2bfe8bbf481977db1bf877bde0e1830f102
Programacion lineal
Programacion lineal
Estructuras_F_CAT
Introducción a la optimización heurística en ingeniería
Vivi Reinoso
Publicidad

Último (10)

PPTX
ORIGEN DE LA IA - GRADO 1102 INTELIGENCIA
PPTX
Conceptos basicos de Base de Datos y sus propiedades
PDF
AutoCAD Herramientas para el futuro, Juan Fandiño
PPTX
Tratará sobre Grafos_y_Arboles_Presentacion.pptx
PPTX
sistemas de informacion.................
PDF
Clase 3 - Presentación visual (Insertando objetos visuales) POWER POINT.pdf
PPTX
Implementación equipo monitor12.08.25.pptx
PPTX
Fundamentos de Python - Curso de Python dia 1
PDF
Su punto de partida en la IA: Microsoft 365 Copilot Chat
DOCX
trabajo programacion.docxxdxxxddxdxxdxdxxxdxxdxdxd
ORIGEN DE LA IA - GRADO 1102 INTELIGENCIA
Conceptos basicos de Base de Datos y sus propiedades
AutoCAD Herramientas para el futuro, Juan Fandiño
Tratará sobre Grafos_y_Arboles_Presentacion.pptx
sistemas de informacion.................
Clase 3 - Presentación visual (Insertando objetos visuales) POWER POINT.pdf
Implementación equipo monitor12.08.25.pptx
Fundamentos de Python - Curso de Python dia 1
Su punto de partida en la IA: Microsoft 365 Copilot Chat
trabajo programacion.docxxdxxxddxdxxdxdxxxdxxdxdxd
Publicidad

Tema 5 construccion algoritmos EDA 1.pdf

  • 1. TEMA 5: Estrategias para construir algoritmos OBJETIVO: El alumno conocerá y aplicará las principales técnicas para construir algoritmos, así como la recursividad como estrategia para desarrollar algoritmos eficientes.
  • 2. 5.1 Aspectos generales de la construcción de algoritmos
  • 3. 5.1 Estrategias de diseño Las estrategias de diseño establecen la forma en la que se modela el problema que se va a resolver Saber cual es la estrategia apropiada para cada problema depende de factores como los datos que se trabajan, las entradas y salidas esperadas
  • 4. 5.1.1 Top-down Consiste en establecer una serie de etapas, niveles o jerarquías iniciando desde los aspectos más generales hasta llegar a los más específicos. Se busca establecer una relación entre las etapas de la solución del problema. Puede ser mediante módulos conectados entre si, de entradas y salidas de información o de datos abstractos que contienen otros.
  • 5. 5.1.1 Top-down Esta técnica tiene los siguientes aspectos: Simplificación del problema y sus módulos haciendo una descomposición. Las diferentes partes del problema pueden ser programadas de modo independiente e incluso por diferentes personas. El programa final queda estructurado en forma de bloque o módulos lo que hace más sencilla su lectura y mantenimiento.
  • 6. 5.1.2 Bottom-Up Parte desde los módulos particulares o específicos que son parte de la solución general de un problema. Se suele utilizar cuando ya se elaboró el diseño de una solución y se va a realizar la implementación de la misma.
  • 7. 5.1.2 Bottom-Up Si el diseño de la solución se realiza siguiendo este modelo, puede ser complicado ya que no se tiene un panorama general del problema completo. Se utiliza cuando el punto de partida es simple y después se agregan nuevas funcionalidades a un sistema
  • 8. 5.1.3 Problemas de Optimización Un problema de optimización consiste en minimizar o maximizar el valor de una variable. La variable que se desea minimizar o maximizar debe ser expresada como función de otra de las variables relacionadas en el problema.
  • 9. 5.1.3 Problemas de Optimización En un problema de optimización no solo se busca una solución, sino que se busca "la mejor" de todas. En los problemas de optimización, la dinámica de los algoritmos busca tomar una serie de decisiones, cuyo efecto general es reducir o maximizar un recurso (una variable) especifico (Mínimo costo - Máximo beneficio)
  • 10. 5.2 Búsqueda exhaustiva o fuerza bruta
  • 11. 5.2.1 Fuerza Bruta - Definición Consiste en verificar todas las posibles soluciones a un problema hasta encontrar aquella o aquellas que cumplan con el propósito de resolver el problema. Es la forma de aproximación más simple para resolver un problema.
  • 12. 5.2.2 Fuerza Bruta – Ventajas y Desventajas VENTAJAS Simplicidad en los algoritmos Aplicable a diferentes tipos de problemas DESVENTAJAS Carece de eficiencia en muchos casos. Funcional para instancias relativamente pequeñas de los problemas que se resuelven
  • 13. 5.2.2 Fuerza Bruta – Ejemplos Buscar los divisores de un número ✓ Verificar si un número es primo. Dado un conjunto de números, encontrar la suma máxima entre ellos Dada una cierta longitud y un conjunto de caracteres, encontrar un password. Búsqueda lineal
  • 15. 5.3.1 Algoritmos Ávidos - Definición Un algoritmo ávido es aquel que, para resolver un determinado problema, elige la mejor opción en cada paso local (de manera directa) con la esperanza de llegar a una solución general óptima. Este esquema algorítmico plantea pocas dificultades al ejecutarse y comprobar su funcionamiento.
  • 16. 5.3.1 Algoritmos Ávidos - Definición Consiste en tomar las decisiones sucesivamente, de modo que cada decisión individual sea la mejor de acuerdo con algún criterio “a corto plazo” cuya evaluación no sea demasiado costosa. Una vez tomada una decisión, no se podrá revertir, ni siquiera si más adelante se hace obvio que no fue una buena.
  • 17. 5.3.2 Algoritmos Ávidos – Forma general 1. Establecer el problema en función de decisiones directas de tal forma que cada decisión resulte en un nuevo subproblema a resolver. 2. Mostrar que siempre hay una solución al problema original a partir de la decisión que tome la etapa actual. 3. Demostrar que el subproblema obtenido a partir de la primer solución proporcionada con el algoritmo “greedy” aún tiene una solución al problema.
  • 18. 5.3.3 Algoritmos Ávidos – Ejemplos La estrategia en la que trabaja un algoritmo greedy es top-down. Los algoritmos de tipo “GREEDY” no necesariamente obtienen la solución óptima. Algunos ejemplos típicos de problemas conocidos que se resuelven utilizando un algoritmo ávido son: ➢ Problema del cambio de monedas. ➢ Problema de la mochila.
  • 19. 5.3.3 Algoritmos Ávidos – Ejemplos Problema del cambio de monedas Consiste en descomponer una cantidad n en el menor numero de monedas. El enfoque de resolución de este problema utilizando un algoritmo de tipo greedy es tomar siempre la moneda de más alta denominación que no rebase la cantidad n.
  • 20. 5.3.3 Algoritmos Ávidos – Ejemplos Ejemplo: Pesos Mexicanos {10,5,2,1} a) $24: {10,10,2,2} b)$15: {10,5} Ejemplo: Otra moneda {11,5,1} $15: { 11, 1, 1, 1, 1} $18:{11,5,1,1}
  • 21. 5.3.3 Algoritmos Ávidos – Ejemplos Problema de la mochila Se tiene una mochila con una capacidad de n kilogramos y se tiene un conjunto de objetos con un peso y un valor económico cada uno. El objetivo es llevar en la mochila el mayor valor posible. Mochila de 100 kg … ¿Qué objetos seleccionar? Peso 10 20 30 40 50 Costo 20 10 65 40 60
  • 22. 5.3.3 Algoritmos Ávidos – Ejemplos  Primero el más ligero Peso = 10 + 20 + 30 + 40 = 100 kg Valor = 20 + 10 + 65 + 40 = 135  Primero el más valioso Peso = 30 + 50 + 10 = 90kg Valor = 65 + 60 + 20 = 145  Primero el que tenga mas valor por unidad de peso Peso = 30 + 10 + 50 = 90kg Valor = 65 + 20 + 60 = 145 Peso 10 20 30 40 50 Costo 20 10 65 40 60
  • 23. 5.3.3 Algoritmos Ávidos – Ejemplos Problema de la mochila fraccional En esta variante del problema, se puede tomar “fracciones” de los objetos de tal manera que siempre se llena la mochila a su máxima capacidad Peso 10 20 30 40 50 Costo 20 10 65 40 60 Valor x unidad 2 0.5 2.1666 1 1.2
  • 24. 5.3.3 Algoritmos Ávidos – Ejemplos  Primero el más ligero Peso = 10 + 20 + 30 + 40 +10 ( de 50)= 110 kg Valor = 20 + 10 + 65 + 40 + 12 = 147  Primero el más valioso Peso = 30 + 50 + 30 (de 40) = 110kg Valor = 65 + 60 + 30 = 155  Primero el que tenga mas valor por unidad de peso Peso = 30 + 10 + 50 + 20( de 40)= 110kg Valor = 65 + 20 + 60 + 20= 165 Peso 10 20 30 40 50 Costo 20 10 65 40 60 Valor x unidad 2 0.5 2.1666 1 1.2
  • 25. 5.4 Divide y vencerás
  • 26. 5.4.1 Divide y vencerás - Generalidades Además de ser una estrategia para construir algoritmos, es una técnica que suele ser considerada para resolver problemas en general. En el campo de los algoritmos consiste en resolver un problema a partir de la solución de sub-problemas del mismo tipo pero de menor tamaño.
  • 27. 5.4.2 Divide y vencerás - Descripción La idea es hacer una división del problema general en sub-problemas del mismo tipo pero de menor tamaño. Si después de hacer la “división”, los sub-problemas son relativamente grandes, se aplica de nuevo la técnica tantas veces como sean necesarias hasta alcanzar problemas suficientemente pequeños para resolverlos directamente.
  • 28. 5.4.2 Divide y vencerás -Descripción El resultado del diseño de estos algoritmos suele ser simple (pocas instrucciones), lo que da lugar a una mejor legibilidad, mayor facilidad en la depuración y análisis del algoritmo. La técnica de divide y vencerás suele ir de la mano con la recursividad.
  • 29. 5.4.2 Divide y vencerás - Descripción Otra consideración importante a la hora de diseñar algoritmos divide y vencerás, es el reparto de la carga entre los sub-problemas, puesto que es importante que la división en sub-problemas se haga de la forma más equilibrada posible.
  • 30. 5.4.3 Divide y vencerás – Forma general La técnica consiste a grandes rasgos en los siguientes pasos: 1.- Se debe plantear el problema de tal forma que se pueda descomponer en k sub-problemas del mismo tipo pero de menor tamaño. A esta parte del procedimiento se le conoce como división. 2.- Se deben resolver los k problemas de manera independiente. 3.- Combinar las soluciones de cada uno de los k problemas para construir la solución al problema original.
  • 31. 5.4.3 Divide y vencerás – Forma general
  • 32. 5.4.2 Divide y vencerás – Ejemplos Búsqueda binaria  Divide: Seleccionar al elemento central en la lista y compararlo con el que buscamos  Conquista: Si el valor objetivo es igual al elemento central, se ha encontrado y el algoritmo termina. En caso de no ser igual se continua de manera recursiva en la mitad izquierda o derecha.  Combinar: Los pasos de división y conquista se repiten en la mitad seleccionada de la lista; hasta que se encuentre la coincidencia o hasta que la lista se reduzca a un tamaño mínimo y no se pueda dividir más.
  • 33. 5.4.2 Divide y vencerás – Ejemplos
  • 34. 5.4.2 Divide y vencerás – Ejemplos
  • 35. 5.4.2 Divide y vencerás – Ejemplos Ordenamiento por Intercalación (Mergesort) Dada una lista desordenada, el procedimiento para ordenarla es el siguiente: ✓ Dividir la lista de n elementos en dos sub-listas de n/2 elementos cada una ✓ Ordenar las dos sub-listas utilizando mergesort ✓ Combinar (intercalar) las dos sub-listas ordenadas para obtener la lista ordenada final.
  • 36. 5.4.2 Divide y vencerás – Ejemplos Ordenamiento por Intercalación (Mergesort)  Divide: Partir recursivamente la lista por la mitad hasta que cada sublista tenga un solo elemento.  Conquista: Una vez que las sublistas tienen un solo elemento, se considera que están ordenadas. Por lo tanto, no es necesario realizar más divisiones y se considera una solución directa.  Combina: A medida que se resuelve la recursión, se combinan las sublistas ordenadas en pares y se fusionan en sublistas más grandes y ordenadas.
  • 37. 5.4.2 Divide y vencerás – Ejemplos
  • 38. 5.4.2 Divide y vencerás – Ejemplos Algoritmos de ordenamiento Multiplicación de matrices Par de puntos más cercano FFT (Transformada Rápida de Fourier) Calendarización de actividades.
  • 40. 3.6.1 Backtrack - Descripción  Backtracking (o búsqueda atrás) es una estrategia de construcción de algoritmos que permite realizar una búsqueda sistemática a través de un espacio de soluciones.  El objetivo es encontrar soluciones parciales a medida que progresa el recorrido, estas soluciones parciales limitan las regiones en las que se puede encontrar una solución completa.
  • 41. 3.6.1 Backtrack - Descripción La búsqueda de solución a un problema no tiene éxito si en alguna etapa, la solución parcial construida hasta el momento no puede continuar. En tal caso, la búsqueda de la solución regresa hacia “atrás” e intenta otra opción de camino.
  • 42. 3.6.1 Backtrack - Descripción La construcción de estrategias backtrack es similar a “greedy” ya que en cada paso se busca un posible camino que conduce a una solución. La diferencia radica en que en este caso si es posible regresar y buscar un camino diferente
  • 43. 3.6.1 Backtrack - Descripción ESTRATEGIA GENERAL  Comprobar si la solución parcial actual es una solución completa y válida. Si la solución parcial no es completa o válida, se elige una opción disponible y se toma una decisión.  Se realiza una llamada recursiva para continuar explorando con la nueva solución parcial.  Después de la llamada recursiva, se deshace la última decisión tomada.  Se repiten los pasos para todas las opciones disponibles, hasta que se encuentre una solución o se hayan explorado todas las opciones.
  • 44. 3.6.2 Backtrack - Ejemplos Recorrer un laberinto hasta encontrar la salida. ✓ No se puede “dividir” el problema ✓ No hay mucha información al inicio ✓ Se requiere tomar decisiones conforme se avanza o progresa en el recorrido. ✓ Si esas decisiones resultan en un camino equivocado, se puede regresar e intentar otra solución
  • 45. 3.6.2 Backtrack - Ejemplos Problema de la “n” reinas ✓ Dado un tablero de ajedrez de n x n, colocar n reinas de tal manera que no se puedan ver (que no se maten) entre ellas ✓ No hay mucha información al inicio ✓ Se requiere tomar decisiones sobre la colocación de las reinas. ✓ Si esas decisiones resultan en una solución equivocada, se puede regresar e intentar otra solución
  • 46. 3.6.2 Backtrack - Ejemplos
  • 47. 3.6.2 Backtrack - Ejemplos  El problema tiene una estructura de solución incremental, donde la decisión tomada en cada etapa afecta las opciones disponibles en las etapas siguientes.  Dado que el problema de las n reinas implica tomar decisiones y descartar opciones inválidas en cada etapa, es una aplicación adecuada para el algoritmo de backtrack.  Permite explorar exhaustivamente todas las posibles soluciones en el espacio de búsqueda del problema.  Se van descartando las opciones que no cumplen las restricciones evitando explorar ramas que no llevarán a una solución válida.
  • 48. 3.6.2 Backtrack - Ejemplos Sudoku
  • 49. 3.6 Backtrack - Ventajas y desventajas La mayor ventaja de la estrategia Backtrack es la flexibilidad que proporciona, ya que dependiendo el enfoque del problema puede encontrar una o todas las soluciones al problema. La desventaja es que dependiendo de la dificultad del problema, puede tomar mucho tiempo en resolverse.
  • 50. 3.6.4 Backtrack - Aplicaciones Se usa en la implementación de los lenguajes de programación, principalmente de inteligencia artificial Se utiliza en análisis sintácticos de los compiladores Algunos algoritmos de teoría de grafos también se pueden analizar con este enfoque
  • 52. 3.4.1 El concepto de Recursividad Una función recursiva es aquella que hace una llamada a sí misma. ¿Cómo puede un método resolver un problema llamándose a sí mismo? La clave está en que esa llamada se hace en un contexto diferente, que generalmente es más simple que el anterior.
  • 53. 3.4.1 El concepto de Recursividad La función puede invocarse a sí misma (una o más veces) hasta llegar a una versión que no requiere una nueva llamada. Para que una definición recursiva sea válida, la referencia a sí misma debe ser más simple que el caso previo.
  • 54. 3.4.2 Definición de una función recursiva Una función recursiva requiere de 2 partes: 1.- Llamada recursiva (a sí misma): En alguna de sus instrucciones se invoca a sí misma, con un parámetro de entrada diferente, que implica un caso más simple. Se hacen nuevas llamadas a la función, cada vez más próximas al caso base. 2.- Caso Base: Trivial o fin de recursión. Es la parte donde el problema se resuelve directamente sin una nueva llamada a sí mismo. Evita la continuación indefinida de la ejecución.
  • 55. 3.4.3 Otros aspectos de Recursividad La recursión es una potente herramienta que se aplica en la resolución de problemas. Las estructuras autoreferenciales son un buen ejemplo de aplicación de naturaleza recursiva.
  • 56. 3.4.3 Otros aspectos de Recursividad La contraparte de la recursividad es la “iteración” o la resolución a través de una fórmula directa. En las funciones iterativas se resuelve un problema aplicando procedimientos de solución repetidamente y no se considera la posible estructura interna del problema. En algunos casos la función recursiva es más eficiente, en otros la iterativa es mejor.
  • 57. 3.4.3 Otros aspectos de Recursividad El diseño de una función recursiva suele ser complicado y algunos de los problemas que ocurren frecuentemente son: ➢ Creación de una lógica circular que ocasiona que la función no termine su ejecución. ➢ Error en la definición del caso base. ➢ El número de operaciones crece excesivamente
  • 58. 3.4.4 Recursividad e Inducción matemática La inducción matemática es la base de la recursividad. Las demostraciones por inducción, muestran que si se sabe que una afirmación es cierta para el caso mas pequeño y se puede demostrar que un caso implica el siguiente, entonces se sabe que la afirmación es cierta para todos los casos. Para probar que una definición recursiva es correcta se debe demostrar por inducción
  • 60. 3.4.5 Ejemplos cotidianos de recursividad Los archivos de una computadora suelen estar almacenados en directorios. Los usuarios pueden crear subdirectorios que almacenan archivos y otros directorios. Al descender o ascender por una escalera se realiza un recorrido recursivo ya que se realiza la misma acción hasta llegar a un caso base (no más escaleras)
  • 61. 3.4.5 Ejemplos cotidianos de recursividad Las palabras de los diccionarios se definen utilizando otras palabras. Al buscar, es posible que no se comprenda la definición y se tenga que buscar el significado de las palabras que contiene dicha definición. Como el diccionario es finito, llega un momento en el que se comprenden todas las palabras, que se caiga en una definición circular, o que alguna palabra no exista.
  • 62. 3.4.6 Funciones matemáticas recursivas La suma de los N primeros enteros. Definición Directa Definición Recursiva Caso Base: S(1) = 1 N N S N S + − = ) 1 ( ) ( 2 ) 1 ( ) ( + = N N N S
  • 64. 3.4.6 Funciones matemáticas recursivas En código int sumaEnteros(int n){ if (n==1) return 1; else return sumaEnteros(n-1) + n }
  • 65. 3.4.6 Funciones matemáticas recursivas Números de Fibonacci: 1,1,2,3,5,8,13,21,34… Caso Base: fib(0) = 0, fib(1) = 1 ) 2 ( ) 1 ( ) ( − + − = n fib n fib n fib
  • 67. 3.4.6 Funciones matemáticas recursivas En código int fibonacci(int n){ if (n<=2) return 1; else return fibonacci(n-1)+ fibonacci(n-2)
  • 68. 3.4.6 Funciones matemáticas recursivas La suma de 2 números. s𝑢𝑚𝑎 𝑎, 𝑏 = ቐ 𝑎 𝑏 = 0 𝑠𝑢𝑚𝑎 𝑎 − 1, 𝑏 + 1 𝑏 < 0 𝑠𝑢𝑚𝑎 𝑎 + 1, 𝑏 − 1 , 𝑏 > 0
  • 69. 3.4.6 Funciones matemáticas recursivas En código int sumaRec (int num1, int num2){ if(num2 == 0) return num1; else if(num2 < 0) return sumaRec(num1-1, num2+1); else return sumaRec(num1+1, num2-1); }
  • 70. 3.4.6 Funciones matemáticas recursivas En código int rec (int a, int b){ if(b == 0) return a; else if(b < 0) return rec(a-1, b+1); else return rec(a+1, b-1); }
  • 71. 3.4.6 Funciones matemáticas recursivas La potencia de un numero (exponente positivo) 𝑝𝑜𝑡𝑒𝑛𝑐𝑖𝑎 𝑏, 𝑛 = ቊ 1 𝑛 = 0 𝑏 ∙ 𝑝𝑜𝑡𝑒𝑛𝑐𝑖𝑎 𝑏, 𝑛 − 1 , 𝑛 > 0
  • 72. 3.4.6 Funciones matemáticas recursivas Factorial de un número Iterativo: Recursivo: Caso Base: fact(0)=1 )) 1 ( )...( 2 )( 1 ( ) ( − − − − = n n n n n n fact ) 1 ( ) ( −  = n fact n n fact