📘 CodingMarble Learn

Técnicas de diseño de algoritmos

Para diseñar un algoritmo, primero especifica el problema: los datos de entrada, la salida esperada y las condiciones. Después escribe pasos claros y finitos en lenguaje natural, como lista, pseudocódigo o diagrama de flujo. Los problemas grandes se dividen de arriba abajo en partes más pequeñas (refinamiento por pasos) o se construyen de abajo arriba con piezas pequeñas ya probadas. Técnicas clásicas: fuerza bruta (probar todo), divide y vencerás (dividir, resolver y combinar; partir por la mitad como en la búsqueda binaria y la ordenación por mezcla), voraz o greedy (elegir cada vez lo que parece mejor; es rápido pero no siempre óptimo), programación dinámica (resolver cada subproblema pequeño una sola vez y guardarlo en una tabla) y vuelta atrás o backtracking (probar una opción y deshacerla en un callejón sin salida). Elige la técnica y las estructuras de datos (arreglos, pilas, árboles binarios) comprobando la corrección y la eficiencia (complejidad en tiempo).

🎬 Historia paso a paso

  1. Primero se especifica el problema. Entrada: 8 números. Salida: el mayor. Pasos: mira cada caja y guarda el más grande hasta ahora.
  2. Divide y vencerás: para hallar un número del 1 al 16, pregunta por el del medio y descarta la mitad. Bastan 4 preguntas.
  3. Voraz: toma siempre la moneda más grande que cabe. Es rápido, pero para 6 con monedas 1, 3, 4 da 3 monedas, y lo mejor son 2.
  4. Programación dinámica: resuelve primero las cantidades pequeñas y guarda cada respuesta en una tabla. La tabla encuentra 6 = 3 + 3.
  5. Vuelta atrás: avanza por un camino; si llegas a un callejón sin salida, vuelve a la última decisión y prueba otro camino hasta llegar a la salida.
  6. Te toca: elige una cantidad y unas monedas. Predice: ¿el método voraz da menos monedas? Compáralo con la PD.

Consejo: arrastra la escena 3D para girarla. Usa dos dedos para hacer zoom.

🤔 Dudas comunes, resueltas

¿Por qué escribir la entrada y la salida antes de programar?

Si no sabes exactamente qué entra y qué debe salir, no puedes comprobar si los pasos son correctos.

¿Cómo pueden bastar 4 preguntas para 16 números?

Cada respuesta descarta la mitad: 16, 8, 4, 2, 1. Las cajas en gris muestran la mitad que se quitó.

Si el método voraz puede fallar, ¿por qué usarlo?

Es muy rápido y sencillo, y para muchos problemas (monedas normales, actividades que terminan antes) está demostrado que es correcto.

¿En qué se diferencia la PD de probarlo todo?

Resuelve cada cantidad pequeña una vez y la reutiliza, así que la tabla crece paso a paso en lugar de explorar todas las combinaciones.

¿La vuelta atrás vuelve a empezar desde el principio?

No. Solo retrocede hasta el último cruce que tenga un camino sin probar y desde ahí sigue.

¿Cómo sé si el método voraz funciona con mis monedas?

Compáralo con la PD en muchas cantidades. Prueba las monedas 1, 7, 10 en el juego libre.

Especificar un problema: entrada, salida y pasos

Antes de escribir código, describe el problema con exactitud. Eso es la especificación.

Escribir los pasos

Un algoritmo es una lista finita de pasos claros que convierte cualquier entrada válida en la salida correcta. Se puede escribir como:

Pruébalo a mano con entradas pequeñas, incluidas las difíciles (todos iguales, números negativos, un solo número).

Diseño descendente y ascendente

Descendente (top-down, refinamiento por pasos): empieza con la tarea completa, divídela en unos pocos pasos grandes y vuelve a dividir cada paso hasta que cada parte sea fácil de programar. Ejemplo: "Hacer un boletín de notas" → leer las notas → calcular los promedios → asignar las calificaciones → imprimir.

Ascendente (bottom-up): construye y prueba primero piezas pequeñas y reutilizables (una función que halla el máximo, otra que ordena) y luego únelas en el programa completo.

Los proyectos reales mezclan ambos: se planifica de arriba abajo y se construye y prueba de abajo arriba.

Divide y vencerás, y el método de la mitad

Divide y vencerás tiene tres movimientos: dividir el problema en partes más pequeñas del mismo tipo, resolver cada parte (muchas veces con recursión) y combinar las respuestas.

Algoritmos voraces

Un algoritmo voraz (greedy) toma la decisión que parece mejor en este momento y nunca la cambia.

Pero el método voraz no siempre acierta: con monedas 1, 3, 4, pagar 6 de forma voraz da 4 + 1 + 1 (3 monedas), mientras que 3 + 3 usa 2. Para fiarte de un método voraz debes demostrarlo o compararlo con un método seguro.

Programación dinámica y vuelta atrás

Programación dinámica (PD)

Cuando los mismos problemas pequeños se repiten, resuelve cada uno una sola vez y guarda la respuesta en una tabla. Mínimo de monedas para la cantidad a: mejor[a] = 1 + min(mejor[a - c]) sobre las monedas c ≤ a, empezando con mejor[0] = 0. Para monedas 1, 3, 4: mejor = 0, 1, 2, 1, 1, 2, 2. Llenar la tabla de pequeño a grande es ascendente (bottom-up); la recursión con memoria es descendente (memoización). Mira la lección aparte de Programación dinámica para saber más.

Vuelta atrás (backtracking)

Construye una solución tomando una decisión cada vez. Si una decisión rompe una regla o lleva a un callejón sin salida, deshazla y prueba la siguiente opción. Se usa en laberintos, sudokus, el problema de las N reinas y para listar todos los subconjuntos. Es una fuerza bruta con cuidado: se salta ramas enteras que no pueden funcionar.

Fuerza bruta

Probar todas las respuestas posibles. Siempre es correcta, pero muchas veces es demasiado lenta (2ⁿ subconjuntos, n! órdenes).

Elegir una técnica: corrección, eficiencia y estructuras de datos

TécnicaSe usa cuandoEjemploTiempo típico
Fuerza brutala entrada es diminutaprobar todas las claves de 3 dígitosa menudo 2ⁿ o n!
Divide y venceráslas partes son independientesbúsqueda binaria, ordenación por mezclaO(log n), O(n log n)
Vorazse ha demostrado que la mejor elección local es seguraselección de actividades, cambioO(n log n)
Programación dinámicalos subproblemas se repitencambio de monedas, caminos más cortostamaño de la tabla
Vuelta atrásbúsqueda con reglaslaberinto, sudokuexponencial, pero con podas

Justifícalo

Corrección: demuestra que el algoritmo siempre termina y da la salida correcta (un invariante de bucle, una demostración o pruebas con casos extremos). Eficiencia: cuenta los pasos cuando n crece (notación O grande) y compáralo con otros métodos.

Las estructuras de datos ayudan

Arreglos para las tablas (PD), pilas para la vuelta atrás (recuerdan adónde volver), colas para buscar nivel por nivel. Un árbol binario guarda los elementos de modo que cada nodo tiene como mucho dos hijos; en un árbol binario de búsqueda las claves menores van a la izquierda y las mayores a la derecha, así que buscar reduce el trabajo a la mitad en cada nivel, igual que la búsqueda binaria.

Pruébalo: monedas y un juego de adivinar

  1. Juega con un amigo a adivinar un número del 1 al 100. Pregunta siempre por el del medio. ¿Puedes ganar siempre en 7 preguntas? (2⁷ = 128.)
  2. Con monedas 1, 3, 4, escribe en papel la tabla de PD para las cantidades de 0 a 10. ¿Dónde falla el método voraz?
  3. Abre el último paso 3D. Prueba monedas 1, 7, 10 y la cantidad 14. El voraz da 10 + 1 + 1 + 1 + 1; la PD da 7 + 7.
  4. Escribe una lista de pasos para "hallar el menor número de una lista" y pruébala con 5, 5, 5 y con un solo número.

Fórmulas y definiciones clave

Ejemplos resueltos

1. Escribe una especificación y una lista de pasos para hallar el mayor de n números.

Entrada: n ≥ 1 números. Salida: el mayor. Pasos: 1. mejor ← primer número. 2. Para cada otro número x: si x > mejor, mejor ← x. 3. Dar como salida mejor. Para 4, 9, 2, 7, 12, 5, 10, 3 la salida es 12 después de 7 comparaciones.

2. ¿Cuántas preguntas necesita el método de la mitad para hallar un número del 1 al 1000?

Cada pregunta reduce el rango a la mitad: 1000 → 500 → 250 → 125 → 63 → 32 → 16 → 8 → 4 → 2 → 1. Son 10 preguntas (2¹⁰ = 1024 ≥ 1000).

3. Paga 87 de forma voraz con monedas 50, 20, 10, 5, 2, 1.

50 (quedan 37), 20 (17), 10 (7), 5 (2), 2 (0): 50 + 20 + 10 + 5 + 2 = 5 monedas.

4. Llena la tabla de PD para monedas 1, 3, 4 hasta la cantidad 7.

mejor[0]=0, [1]=1, [2]=2, [3]=1, [4]=1, [5]=min(mejor4, mejor2, mejor1)+1=2, [6]=min(mejor5, mejor3, mejor2)+1=2, [7]=min(mejor6, mejor4, mejor3)+1=2 (3 + 4).

5. Actividades (inicio-fin): A 9-11, B 10-12, C 11-13, D 12-14, E 13-15. Elige el mayor número de actividades que no se solapen.

Voraz por fin más temprano: A (termina a las 11), luego C (empieza a las 11, termina a las 13), luego E (empieza a las 13). 3 actividades: A, C, E.

6. Planifica de arriba abajo un programa que diga a una clase su nota media y quién es el mejor alumno.

Nivel 1: leer datos → calcular → imprimir. Nivel 2: leer nombres y notas en listas; calcular el total y la media; hallar la nota máxima y su nombre; imprimir ambos. Después cada pieza se programa y se prueba de abajo arriba.

Errores comunes

Test de práctica

1. La especificación de un problema debe indicar:
2. La búsqueda binaria en 16 elementos ordenados necesita como máximo unas:
3. ¿Qué técnica toma siempre la mejor opción a simple vista en ese momento?
4. La programación dinámica funciona bien cuando:
5. En la búsqueda en un laberinto, volver al último cruce después de un callejón sin salida es:

Práctica: responde tú mismo

Escribe o elige tu respuesta y pulsa Comprobar. Usa la pista si te atascas; la solución completa aparece después de responder.

Preguntas frecuentes

¿Cuáles son las principales técnicas de diseño de algoritmos?

Fuerza bruta, divide y vencerás, voraz, programación dinámica y vuelta atrás, que se eligen después de especificar la entrada y la salida.

¿Cuál es la diferencia entre el método voraz y la programación dinámica?

El voraz toma en cada paso una sola decisión que parece la mejor y nunca mira atrás. La PD considera todas las opciones de los subproblemas pequeños y guarda las mejores respuestas, así que encuentra el óptimo verdadero cuando los subproblemas se solapan.

¿Qué es el diseño descendente frente al ascendente?

El descendente divide la tarea completa en pasos más pequeños; el ascendente construye y prueba primero las partes pequeñas y luego las une. La mayoría de los programas usan los dos.

Dónde se estudia

PolandSzkoła podstawowa, klasa VIIUnderstanding, analysing and solving problems
PolandSzkoła podstawowa, klasa VIIIUnderstanding, analysing and solving problems
PolandLiceum ogólnokształcące, klasa IUnderstanding, analysing and solving problems
China高三Electives (选修)

Aprende antes

Aprende después

Lecciones relacionadas

Todas las lecciones de Computer Science