Un algoritmo codicioso crea una solución paso a paso, eligiendo siempre la opción que luce mejor en este momento, sin reconsiderar elecciones pasadas. Sin retroceder, sin mirar hacia adelante.
Funciona cuando se cumplen dos propiedades:
Dado un conjunto de actividades con horas de inicio y finalización, seleccione el número máximo de actividades que no se superpongan.
Estrategia codiciosa: ordenar por hora de finalización, elija siempre la actividad que finalice antes.
def max_activities(intervals):
intervals.sort(key=lambda x: x[1])
count, end = 0, 0
for s, e in intervals:
if s >= end:
count += 1
end = e
return count
¿Por qué funciona esto? Elegir la actividad que termine más temprano deja más espacio para actividades futuras. Ninguna otra opción puede hacerlo mejor.
Cree un código binario óptimo sin prefijos fusionando repetidamente los dos símbolos de menor frecuencia. Esto es codicioso: en cada paso, fusiona el par más barato. El resultado es un árbol donde los símbolos frecuentes obtienen códigos cortos.
Dada una matriz donde nums[i] es la longitud máxima de salto desde el índice i, determine si puede alcanzar el último índice.
Enfoque codicioso: realiza un seguimiento del índice más lejano alcanzable hasta el momento. Escanee de izquierda a derecha; si alguna vez se queda atrás, devuelva falso.
Iniciar sesión unirse a la discusión
def can_jump(nums):
farthest = 0
for i, jump in enumerate(nums):
if i > farthest:
return False
farthest = max(farthest, i + jump)
return True
En el juego de salto, ¿qué representa la variable codiciosa ”más lejos”?
Recorre una ruta circular con gasolineras. En la estación i ganas gas[i] de combustible y gastas cost[i] para llegar a la siguiente estación. Encuentra la estación inicial que te permita completar el circuito, o regresa −1.
Visión codiciosa: si el gas total ≥ el costo total, existe una solución. Realizar un seguimiento de un superávit actual; cada vez que cae por debajo de cero, la respuesta debe comenzar después de ese punto.
Programe tareas con un tiempo de reutilización de n entre tareas idénticas. Codicioso: elige siempre la tarea restante más frecuente. La respuesta depende de la frecuencia máxima y de cuántas tareas la comparten.
Tasks: A A A B B C, cooldown = 2
Schedule: A B C A B _ A
Total = 7
Mochila fraccionaria: puedes llevar fracciones de artículos. Trabajos codiciosos: ordene por valor por peso, tome primero la mejor proporción.
0/1 mochila: los artículos son de todo o nada. Greedy falla aquí porque saltarse un artículo pesado pero valioso podría ser peor que tomar dos más livianos. Esto requiere programación dinámica.
Items: (weight=3, value=4), (weight=2, value=3), (weight=2, value=3)
Capacity: 4
Greedy (best ratio first): takes item 1 (w=3, v=4) → 1 remaining → can't fit rest → value = 4
Optimal: takes items 2+3 (w=4, v=6) → value = 6 ✗ Greedy fails!
¿Por qué el enfoque codicioso falla en el problema de la mochila 0/1?
✅ Funciona cuando puedes demostrar la propiedad de elección codiciosa:
❌ Falla cuando los óptimos locales no se combinan en óptimos globales:
La técnica estándar: asumir una solución óptima que no utiliza la elección codiciosa. Demuestre que puede intercambiar una de sus opciones por la opción codiciosa sin empeorar la solución. Esto demuestra que la avaricia es al menos igual de buena.
¿Para qué se utiliza el 'argumento de intercambio'?
| Aspecto | Codicioso | Programación dinámica | |--------|--------|---------------------| | Opciones | Una mejor opción por paso | Explora todos los subproblemas | | ¿Revisita el pasado? | Nunca | Sí: almacena subresultados | | Velocidad | Generalmente más rápido | Depende del espacio de estados | | Corrección | Sólo si es demostrable | Siempre (si se formula correctamente) |
En caso de duda, comience con la avaricia; si no puede demostrar que funciona, cambie a DP.