Decrementa y vencerás
Dr. Eduardo A. RODRÍGUEZ TELLO
CINVESTAV-Tamaulipas
19 de febrero de 2018
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 1 / 30
1 Decrementa y vencerásTipos de algoritmos decrementa y vencerásOrdenamiento por inserciónAlgoritmos para generar objetos combinatorios
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 2 / 30
Decrementa y vencerás
Decrementa y vencerás
Algoritmo decrementa y vencerás1 Reduce la instancia del problema a la instancia más pequeña del
mismo problema
2 Resuelve la instancias más pequeña
3 Extiende la solución de la instancias más pequeña para obteneruna solución del problema original
Puede ser implementado de arriba-abajo (top-down), o de abajo-arriba(bottom-up)
También se conoce como enfoque inductivo o incremental
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 3 / 30
Decrementa y vencerás Tipos de algoritmos decrementa y vencerás
1 Decrementa y vencerásTipos de algoritmos decrementa y vencerásOrdenamiento por inserciónAlgoritmos para generar objetos combinatorios
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 4 / 30
Decrementa y vencerás Tipos de algoritmos decrementa y vencerás
Decrementa y vencerás
Existen tres tipos de algoritmos decrementa y vencerás:1 Decremento con una constante (usualmente 1):
Ordenamiento por inserciónOrdenamiento topológicoAlgoritmos para generar permutaciones, subconjuntos
2 Decremento con factor constante (usualmente la mitad)Búsqueda binariaExponenciación por cuadradosMultiplicación por el método ruso
3 Decremento de tamaño variableAlgoritmo de EuclidesSelección por particiónJuego de tipo Nim
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 5 / 30
Decrementa y vencerás Tipos de algoritmos decrementa y vencerás
Decrementa y vencerás, ¿Diferencia?
Considere el problema de exponenciación: calcular f(n) = an
Fuerza bruta:an = a ∗ · · · ∗ a︸ ︷︷ ︸
n veces
Decrementa en uno:
an =
{an−1 · a si n > 0,1 si n = 0,
Decrementa en un factor constante:
an =
(a
n2
)2si n es par y positivo,(
an−12
)2· a si n es impar,
1 si n = 0,
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 6 / 30
Decrementa y vencerás Ordenamiento por inserción
1 Decrementa y vencerásTipos de algoritmos decrementa y vencerásOrdenamiento por inserciónAlgoritmos para generar objetos combinatorios
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 7 / 30
Decrementa y vencerás Ordenamiento por inserción
Ordenamiento por inserción
Para ordenar un arreglo A[0 . . . n− 1], ordena recursivamenteA[0 . . . n− 2] e inserta después A[n− 1] en su posición correctadentro del sub-arreglo A[0 . . . n− 2]
Usualmente se implementa bottom-up (no recursivo)
A[0] ≤ . . . ≤ A[j] < A[j + 1] ≤ . . . ≤ A[i− 1] | A[i] . . . A[n− 1]
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 8 / 30
Decrementa y vencerás Ordenamiento por inserción
Ordenamiento por inserción
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 9 / 30
Decrementa y vencerás Ordenamiento por inserción
Ordenamiento por inserción, Eficiencia temporal
Peor caso
Arreglo ordenado decrecientemente. La operación básica es la comparación A[j] > v
Cworst(n) =
n−1∑i=1
i−1∑j=0
1 =
n−1∑i=1
i =n(n− 1)
2∈ Θ(n2)
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 10 / 30
Decrementa y vencerás Ordenamiento por inserción
Ordenamiento por inserción, Eficiencia temporal
Peor caso
Arreglo ordenado decrecientemente. La operación básica es la comparación A[j] > v
Cworst(n) =
n−1∑i=1
i−1∑j=0
1 =
n−1∑i=1
i =n(n− 1)
2∈ Θ(n2)
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 10 / 30
Decrementa y vencerás Ordenamiento por inserción
Ordenamiento por inserción, Eficiencia temporal
Mejor caso
Arreglo ordenado crecientemente.
Cbest(n) =
n−1∑i=1
1 = n− 1 ∈ Θ(n)
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 11 / 30
Decrementa y vencerás Ordenamiento por inserción
Ordenamiento por inserción, Eficiencia temporal
Mejor caso
Arreglo ordenado crecientemente.
Cbest(n) =
n−1∑i=1
1 = n− 1 ∈ Θ(n)
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 11 / 30
Decrementa y vencerás Ordenamiento por inserción
Ordenamiento por inserción, Eficiencia temporal
Caso promedio
Cavg(n) ≈ n2
4∈ Θ(n2)
También es rápido en arreglos casi ordenados
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 12 / 30
Decrementa y vencerás Ordenamiento por inserción
Ordenamiento por inserción, Eficiencia temporal
Caso promedio
Cavg(n) ≈ n2
4∈ Θ(n2)
También es rápido en arreglos casi ordenados
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 12 / 30
Decrementa y vencerás Ordenamiento por inserción
Ordenamiento por inserción, Ventajas
Su eficiencia promedio junto con la excelente eficiencia enarreglos casi ordenados permite al ordenamiento por insercióndestacar frente a otros algoritmos elementales de ordenamiento(por selección y de burbuja) aplicados a conjuntos de datosrelativamente pequeños
Su extensión conocida como ordenamiento Shell [Shell 1959] daincluso mejores resultados al aplicarlo a archivos relativamentegrandes
Eficiencia espacial: in-situ (in-place), i.e., está acotada por unafunción constante O(1)
Es estable, i.e., no cambia el orden relativo de los elementos conigual llave
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 13 / 30
Decrementa y vencerás Algoritmos para generar objetos combinatorios
1 Decrementa y vencerásTipos de algoritmos decrementa y vencerásOrdenamiento por inserciónAlgoritmos para generar objetos combinatorios
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 14 / 30
Decrementa y vencerás Algoritmos para generar objetos combinatorios
Generación de permutaciones
Algoritmo de Heap [Heap, 1963], mínimo cambio - decremento en uno
Procedure generatePermutations(n,A)
Require: Longitud de las permutaciones n; arreglo A de tamaño m donde m ≥ n1: if n == 1 then2: print(A)3: else4: for i← 1; i ≤ n; i← i + 1 do5: generatePermutations(n− 1, A)6: if n es impar then7: j ← 18: else9: j ← i
10: end if11: swap(A[j], A[n])12: end for13: end if
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 15 / 30
Decrementa y vencerás Algoritmos para generar objetos combinatorios
Generación de permutaciones
Podemos observar un buen ejemplo del funcionamiento de estealgoritmo en la siguiente URL:
http://en.wikipedia.org/wiki/Heap's_algorithm
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 16 / 30
Decrementa y vencerás Algoritmos para generar objetos combinatorios
Algoritmo de Heap, Análisis
swap es la operación básica. El número de operaciones realizadas para unarreglo de n elementos es S(n):
S(1) = 0
S(n) =
n∑i=1
[S(n− 1) + 1]
S(n) = nS(n− 1) + n para n > 1
Resolviendo la relación de recurrencia mediante sustitución hacia atrás:
S(n) = nn−1S(1) +
n−1∑k=1
nk
Como S(1) = 0 sólo queda el término de la derecha:
S(n) =
n−1∑k=1
nk ≈ n!(e− 1)− 1 ∈ Θ(n!)
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 17 / 30
Decrementa y vencerás Algoritmos para generar objetos combinatorios
Algoritmo de Heap, Análisis
swap es la operación básica. El número de operaciones realizadas para unarreglo de n elementos es S(n):
S(1) = 0
S(n) =
n∑i=1
[S(n− 1) + 1]
S(n) = nS(n− 1) + n para n > 1
Resolviendo la relación de recurrencia mediante sustitución hacia atrás:
S(n) = nn−1S(1) +
n−1∑k=1
nk
Como S(1) = 0 sólo queda el término de la derecha:
S(n) =
n−1∑k=1
nk ≈ n!(e− 1)− 1 ∈ Θ(n!)
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 17 / 30
Decrementa y vencerás Algoritmos para generar objetos combinatorios
Ejercicio
Algoritmo de Heap [Heap, 1963], mínimo cambio - decremento en uno
Procedure generatePermutations(n,A)
Require: Longitud de las permutaciones n; arreglo A de tamaño m donde m ≥ n
1: if n == 1 then2: print(A)3: else4: for i← 1; i ≤ n; i← i+ 1 do5: generatePermutations(n− 1, A)6: if n es impar then7: swap(A[1], A[n])8: else9: swap(A[i], A[n])10: end if11: end for12: end if
Dado A = {1, 2, . . . , n}, y n = 4 trace la salida del algoritmo
¿Cómo podría probarse la correctitud (correctness) del algoritmo?
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 18 / 30
Decrementa y vencerás Algoritmos para generar objetos combinatorios
Generación de permutaciones
Respuesta:
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 19 / 30
Decrementa y vencerás Algoritmos para generar objetos combinatorios
Otros algoritmos para generar permutaciones
Steinhaus-Johnson-Trotter (Johnson-Trotter)
Lexicographic-order
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 20 / 30
Decrementa y vencerás Algoritmos para generar objetos combinatorios
Algoritmo Steinhaus-Johnson-Trotter
Podemos generar las permutaciones en un mismo orden singenerar explícitamente permutaciones de tamaño más pequeño
Para ello asociamos una dirección a cada elemento k (flecha)
Un elemento k es movible si su flecha apunta a un númeroadyacente más pequeño
Ejemplo con n = 3:−→3←−2−→4←−1
3 y 4 son movibles mientras que 1 y 2 no lo son
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 21 / 30
Decrementa y vencerás Algoritmos para generar objetos combinatorios
Algoritmo Steinhaus-Johnson-Trotter
Ejemplo con n = 3
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 22 / 30
Decrementa y vencerás Algoritmos para generar objetos combinatorios
Algoritmo Steinhaus-Johnson-Trotter
Este algoritmo es uno de los más eficientes para generarpermutaciones
Puede ser implementado para correr en tiempo proporcional alnúmero de permutaciones, i.e., Θ(n!)
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 23 / 30
Decrementa y vencerás Algoritmos para generar objetos combinatorios
Algoritmo Lexicographic-order
Observemos que el orden en que genera las permutaciones elalgoritmo Steinhaus-Johnson-Trotter no es el más natural
Por ejemplo, sería deseable que la permutación n(n− 1) . . . 1fuera la última de la lista
Esto sería el caso si se listaran en orden ascendente, tambiénconocido como lexicográfico
Ejemplo con n = 3:123 132 213 231 312 321
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 24 / 30
Decrementa y vencerás Algoritmos para generar objetos combinatorios
Algoritmo Lexicographic-order
Cómo podemos generar la permutación que sigue dea1, a2, . . . , an−1, an en el orden lexicográfico
Si an−1 < an, lo cual es el caso para la mitad de todas laspermutaciones, podemos simplemente intercambiar estos dosúltimos elementos
Por ejemplo, 123 es seguido de 132
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 25 / 30
Decrementa y vencerás Algoritmos para generar objetos combinatorios
Algoritmo Lexicographic-order
Si an−1 > an, por ejemplo (5, 1, 7, 6, 3, 9, 8, 4, 2)
Encontramos el sufijo decreciente más largo de la permutaciónai+1 > ai+2 > . . . > an (pero ai < ai+1). Iniciando al final tenemosque 4 > 2, 8 > 4, 9 > 8, y finalmente 3 < 9.
Por lo tanto el pivote es i = 5 (ai = 3 y ai+1 = 9):(5, 1, 7, 6, 3, 9, 8, 4, 2)
Iniciando en i + 1 observamos que 3 < 9, 3 < 8, 3 < 4, pero 3 > 2.El ultimo valor que es todavía mayor que 3 es 4, y su índice esj = 8.
Intercambiamos ai y aj (incrementando ai), para obtener:(5, 1, 7, 6, 4, 9, 8,3, 2)
Invertimos el nuevo sufijo (desde ai+1 hasta an) para obtener elresultado:(5, 1, 7, 6, 4, 2, 3, 8, 9)
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 26 / 30
Decrementa y vencerás Algoritmos para generar objetos combinatorios
Algoritmo Lexicographic-order
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 27 / 30
Decrementa y vencerás Algoritmos para generar objetos combinatorios
Generación de subconjuntos
El conjunto potencia de un conjunto A = {a1, . . . , an} es elconjunto de todos los subconjuntos de A, incluyendo el conjuntovacío y al mismo A.Ejemplos:
Para un conjunto con n elementos es posible formar 2n
subconjuntos¿Cómo generarlos?
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 28 / 30
Decrementa y vencerás Algoritmos para generar objetos combinatorios
Generación de subconjuntos
Código binario reflejado (Código Gray):Algoritmo de mínimo cambio para generar las 2n cadenas binariascorrespondientes a todos los subconjuntos de un conjunto de nelementos (n > 0)Ventaja: cada cadena difiere de su predecesora sólo en un bitSuponga el caso n = 3
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 29 / 30
Decrementa y vencerás Algoritmos para generar objetos combinatorios
Generación de subconjuntos
Ejemplo: generar el código binario reflejado para n = 4.Como el código Gray para n = 3 es: 000 001 011 010 110 111 101 100, entonces elalgoritmo haría lo siguiente:
Dr. Eduardo RODRÍGUEZ T. (CINVESTAV) Decrementa y vencerás 19 de febrero de 2018 30 / 30