"If all you have is a hammer, everything looks like a nail" — Abraham Maslow, 1962
Son aproximaciones generales para construir soluciones eficientes a diferentes tipos de problemas.
Consiste en elegir la opción óptima en cada paso local con la esperanza de llegar a una solución general óptima.
Se deben entregar 36 pesos y se requiere gastar el menor número de monedas (hay monedas de 1, 2, 5, 10 y 20 pesos)
Iremos seleccionando las monedas una a una. Cada elección será un paso local, con las esperanza de que al final, la solución general sea óptima.
El criterio será elegir siempre la moneda mas alta posible
Necesité 4 monedas: 20, 10, 5 y 1. No hay forma de formar 36 pesos con menos de 4 monedas, por lo tanto la suma de las soluciones locales, fue una solución óptima.
Posiblemente, el enfoque greedy sea el mas fácil de programar. Sin embargo, su problema no radica en la programación sino en el concepto: No siempre la suma de las soluciones locales óptimas es la solución optima general.
El mismo ejemplo anterior (36 pesos) pero ahora tenemos monedas de 1, 5, 10, 18, 20
El mismo ejemplo anterior (36 pesos) pero ahora tenemos monedas de 1, 5, 10, 18, 20
El mismo ejemplo anterior (36 pesos) pero ahora tenemos monedas de 1, 5, 10, 18, 20
El mismo ejemplo anterior (36 pesos) pero ahora tenemos monedas de 1, 5, 10, 18, 20
El mismo ejemplo anterior (36 pesos) pero ahora tenemos monedas de 1, 5, 10, 18, 20
De nuevo, tenemos como solución 4 monedas: 20, 10, 5 y 1. Sin embargo se habria podido resolver con 2 monedas de 18. La suma de las soluciones locales óptimas no fue igual a una solución óptima general.
En el primer ejemplo, funciona porque cada moneda es como máximo la mitad de la moneda siguiente. En el segundo caso no aplica este criterio.
Un problema puede ser resuelto de manera greedy si cumple las siguientes dos condiciones:
Debo formar un string, con una lista de caracteres que me indica el problema. Cada caracter leido puedo agregarlo al inicio del String, o al final. El objetivo es formar la palabra lexicográficamente mayor posible.
Criterio: Cada paso local consiste en tomar un caracter y agregarlo al inicio o al final. Si el caracter actual es lexicográficamente mayor al primer caracter, lo agrego al inicio. De lo contrario, lo agrego al final.
ABAAB | A |
ABAAB | A |
ABAAB | BA |
ABAAB | A |
ABAAB | BA |
ABAAB | BAA |
ABAAB | A |
ABAAB | BA |
ABAAB | BAA |
ABAAB | BAAA |
ABAAB | A |
ABAAB | BA |
ABAAB | BAA |
ABAAB | BAAA |
ABAAB | BBAAA |