Está en la página 1de 45

MATEMÁTICAS DISCRETAS

Marco E. Benalcázar, Ph.D.

24 de abril de 2019
Análisis de la Complejidad de Algoritmos

Lo que hasta ahora hemos estudiado es lo siguiente:

Análisis asintótico:

f(n)
Función O
ALGORITMO Función 
(Secuencia finita de pasos que
permiten resolver un problema) Función 

Función de complejidad: f: 

Función discreta
Análisis de la Complejidad de Algoritmos

Hoy, a través de ejemplos, vamos a ver cómo obtener la función de complejidad


temporal, f(n), para un algoritmo.
Análisis asintótico:

f(n)
Función O
ALGORITMO Función 
(Secuencia finita de pasos que
permiten resolver un problema) Función 

Función de complejidad temporal: Es una función discreta que permite calcular


el número total de operaciones elementales (sumas, multiplicaciones y
comparaciones) para cada posible instancia de un determinado problema como
una función del tamaño de dicha instancia, n.
Análisis de Algoritmos: Mejor, Peor, y Caso Promedio

➢ Dado un algoritmo, no todas las entradas de tamaño n toman el mismo tiempo en


ejecutarse.

Ejemplo: Sea un algoritmo de búsqueda secuencial de un elemento K en un arreglo


de n enteros: Comenzar la búsqueda en el primer elemento del arreglo y hacer
comparaciones sucesivas hasta encontrar K.

1. ¿Cuántas comparaciones se deben ejecutar para encontrar K = 4?


2. ¿Cuántas comparaciones se deben ejecutar para encontrar K = 7?

10 8 6 4 5 3 1 9 2 7
1 2 3 4 5 6 7 8 9 10

Para este ejemplo particular, donde n = 10, responder las siguientes preguntas:

➢ ¿Cuál es el mejor caso?

➢ ¿Cuál es el peor caso?

➢ ¿Cuál es el caso promedio?


Análisis de Algoritmos: Mejor, Peor, y Caso Promedio

➢ Dado un algoritmo, no todas las entradas de tamaño n toman el mismo tiempo en


ejecutarse.

Ejemplo: Sea un algoritmo de búsqueda secuencial de un elemento K en un arreglo


de n enteros: Comenzar la búsqueda en el primer elemento del arreglo y hacer
comparaciones sucesivas hasta encontrar K.

1. ¿Cuántas comparaciones se deben ejecutar para encontrar K = 4?


2. ¿Cuántas comparaciones se deben ejecutar para encontrar K = 7?

10 8 6 4 5 3 1 9 2 7
1 2 3 4 5 6 7 8 9 10
Para este ejemplo particular, donde n = 10, responder las siguientes preguntas:

➢ ¿Cuál es el mejor caso? Cuando el elemento que buscamos está al inicio del arreglo

➢ ¿Cuál es el peor caso?

➢ ¿Cuál es el caso promedio?


Análisis de Algoritmos: Mejor, Peor, y Caso Promedio

➢ Dado un algoritmo, no todas las entradas de tamaño n toman el mismo tiempo en


ejecutarse.

Ejemplo: Sea un algoritmo de búsqueda secuencial de un elemento K en un arreglo


de n enteros: Comenzar la búsqueda en el primer elemento del arreglo y hacer
comparaciones sucesivas hasta encontrar K.

1. ¿Cuántas comparaciones se deben ejecutar para encontrar K = 4?


2. ¿Cuántas comparaciones se deben ejecutar para encontrar K = 7?

10 8 6 4 5 3 1 9 2 7
1 2 3 4 5 6 7 8 9 10
Para este ejemplo particular, donde n = 10, responder las siguientes preguntas:

➢ ¿Cuál es el mejor caso? Cuando el elemento que buscamos está al inicio del arreglo

➢ ¿Cuál es el peor caso? Cuando el elemento que buscamos está al final del arreglo.

➢ ¿Cuál es el caso promedio?


Análisis de Algoritmos: Mejor, Peor, y Caso Promedio

➢ Dado un algoritmo, no todas las entradas de tamaño n toman el mismo tiempo en


ejecutarse.

Ejemplo: Sea un algoritmo de búsqueda secuencial de un elemento K en un arreglo


de n enteros: Comenzar la búsqueda en el primer elemento del arreglo y hacer
comparaciones sucesivas hasta encontrar K.

1. ¿Cuántas comparaciones se deben ejecutar para encontrar K = 4?


2. ¿Cuántas comparaciones se deben ejecutar para encontrar K = 7?

10 8 6 4 5 3 1 9 2 7
1 2 3 4 5 6 7 8 9 10
Para este ejemplo particular, donde n = 10, responder las siguientes preguntas:

➢ ¿Cuál es el mejor caso? Cuando el elemento que buscamos está al inicio del arreglo.
➢ ¿Cuál es el peor caso? Cuando el elemento que buscamos está al final del arreglo.

➢ ¿Cuál es el caso promedio? Cuando el elemento que buscamos está en posición 1, o en la posición 2,
o en la posición 3, y así sucesivamente hasta la última posición. Asumimos que, para este ejemplo, la
probabilidad de encontrar el número en cualquiera de las 10 posiciones es 1/10.
Definiciones: Tiempos de Ejecución del Mejor
Caso, Peor Caso, y Caso Promedio
Dado un conjunto de entradas D = {dato1, dato2,…, datoN }, donde cada entrada es
de tamaño n, para un algoritmo determinado se definen los siguientes casos:

Tiempo del mejor caso: Es el tiempo mínimo necesario para ejecutar el algoritmo
entre todos los elementos del conjunto de entradas D.

Tiempo del peor caso: Es el tiempo máximo necesario para ejecutar el algoritmo
entre todos los elementos del conjunto de entradas D.

Tiempo del caso promedio: Es el tiempo esperado* para ejecutar el algoritmo


entre todos los elementos del conjunto de entradas D.

Problema 1: ¿Qué pasa con el cálculo del tiempo del mejor y peor casos si el
conjunto de datos de entrada es muy grande o infinito?

* El valor esperado de una variable aleatoria discreta se calcula como:

[X] = x1(x1) + x2(x2) + ….+ xN(xN)

(xi) = probabilidad del elemento xi


Análisis de Algoritmos: Caso Promedio

➢ El caso promedio de un algoritmo aplicado a un conjunto de entradas, cada una


de tamaño n, D = {dato1, dato2,…, datoN} se caracteriza a través del tiempo
esperado de ejecución, el mismo que se calcula de la siguiente manera:

[T] = t(dato1)(dato1) + t(dato2)(dato2) + ….+ t(datoN)(datoN)

Problema 2: Aunque analizar el tiempo esperado de ejecución de un algoritmo


parece ser la mejor forma de caracterizar la complejidad computacional de un
algoritmo, encontrar su valor puede resultar una tarea extremadamente
complicada.

➢ ¿Por qué?

➢ Porque para calcular el tiempo del caso promedio, o tiempo esperado, se


necesita conocer (o al menos estimar) la distribución probabilística subyacente a
la generación de los datos. Esto es, para calcular [T] se debe conocer los valores
de las probabilidades: (dato1), (dato2), …, (datoN).
Solución Ante los Problemas 1 y 2

➢ Dado un algoritmo, en lugar de encontrar los tiempos exactos de ejecución del


mejor y peor casos, es preferible analizar la manera en la que crece o aumenta el
tiempo de ejecución a medida que se incrementa el tamaño, n, de cada entrada.

➢ Lo anterior implica caracterizar al algoritmo a través de su función de


complejidad temporal, f(n), y luego encontrar las funciones O, , y  para f(n).

➢ NO confundirse entre los siguientes descriptores:

Cota superior (O) y tiempo del peor caso.

Cota inferior () y tiempo del mejor caso.

Se refiere el peor y mejor tiempos que un


algoritmo tarda para procesar datos de
Miden tasas de crecimiento tamaño n
Función de Complejidad para Algunos Casos
(1)
La pregunta general es ¿cómo se puede determinar la complejidad de ejecución
de un fragmento de código?

La respuesta depende de las tareas incluidas como parte del código.

Fuente: http://web.mit.edu/16.070/www/lecture/big_o.pdf
Función de Complejidad para Algunos Casos
(2)

Fuente: http://web.mit.edu/16.070/www/lecture/big_o.pdf
Función de Complejidad para Algunos Casos
(3)

Fuente: http://web.mit.edu/16.070/www/lecture/big_o.pdf
Ejemplo

Número triangular Tn
Notas Importantes para Realizar el Análisis
de Complejidad Temporal de un Algoritmo

a) En algoritmos de ordenamiento y búsqueda se cuenta el número de


comparaciones.

b) En algoritmos que usan aritmética se cuenta las multiplicaciones y se omite


las adiciones.

➢ Las operaciones clave se definen así cuando el tiempo para efectuar las otras
operaciones es mucho menor que o es proporcional al tiempo para realizar las
operaciones clave. El espacio se mide al contar el máximo de memoria necesaria
para el algoritmo.

➢ La complejidad de un algoritmo es la función f(n) que proporciona el requisito


de tiempo de ejecución y/o espacio de almacenamiento del algoritmo en
términos del tamaño n de los datos de entrada. A menudo, el espacio de
almacenamiento requerido por un algoritmo es un simple múltiplo del tamaño de
los datos. En consecuencia, a menos que se establezca o implique otra cosa, el
término “complejidad” se refiere al tiempo de ejecución del algoritmo.
ANÁLISIS DE
COMPLEJIDAD
TEMPORAL DE
ALGORITMOS
NO
RECURSIVOS
Ejemplo 1: Selección del Número Máximo de una
Secuencia de n Números

DEMO EN MATLAB
(FindMaximum.m)

(n)
Ejemplo 2: Ordenamiento por Inserción
(Isertion Sort) (1)

Fuente: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-introduction-to-algorithms-sma-5503-fall-
2005/video-lectures/lecture-1-administrivia-introduction-analysis-of-algorithms-insertion-sort-mergesort/lec1.pdf
Ejemplo 2: Ordenamiento por Inserción
(Isertion Sort) (2)

InsertionSort.m
Fuente: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-introduction-to-algorithms-sma-5503-fall-
2005/video-lectures/lecture-1-administrivia-introduction-analysis-of-algorithms-insertion-sort-mergesort/lec1.pdf
Ejemplo 2: Ordenamiento por Inserción
(Isertion Sort) (3)
Ejemplo 2: Ordenamiento por Inserción
(Isertion Sort) (4)
Ejemplo: Revisar el PDF del siguiente link:
Fuente: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-introduction-to-algorithms-sma-5503-fall-
2005/video-lectures/lecture-1-administrivia-introduction-analysis-of-algorithms-insertion-sort-mergesort/lec1.pdf

Fuente: http://web.mit.edu/16.070/www/lecture/lecture_5_2.pdf
Ejemplo 2: Ordenamiento por Inserción
(Isertion Sort) (5)
Ejemplo: Revisar el PDF del siguiente link:
Fuente: http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-046j-introduction-to-algorithms-sma-5503-fall-
2005/video-lectures/lecture-1-administrivia-introduction-analysis-of-algorithms-insertion-sort-mergesort/lec1.pdf

Número Máximo de Comparaciones


Iteración e Inserciones

2 1
3 2
4 3
. .
. .
. .
n n-1

(n )
2
Fuente: http://web.mit.edu/16.070/www/lecture/lecture_5_2.pdf
Ejemplo 3: Ordenamiento de Números por el “Método de
la Burbuja” o “Bubble Sorting”

La secuencia de números a ordenar es:

si, si + 1, si+2,…, sj
Iteración Número Máximo de Comparaciones y Swaps

1 (n - 1)
2 (n – 2)
3 (n – 3)
. .
. .
. .
n–1 n – (n -1) = 1

(n )
2
Ejemplo 4: Ordenamiento por Merge-Sort

Este algoritmo se basa en la estrategia “divide y vencerás” (divide and conquer)*.

(n*log2(n))
Algoritmo Merge Ordenamiento de los elementos de los subgrupos
* Estrategia Divide y Vencerás: Consiste en dividir, de forma recursiva, un
problema en sub-problemas del mismo tipo (o en problemas relacionados). Esta
división se realiza hasta que los sub-problemas resultantes se vuelven lo
suficientemente simples como para ser resueltos directamente. Luego, las
soluciones de los sub-problemas se combinan para obtener la solución del
problema original.
Ejemplo 5: Predicción de un Número Entero X con un Número
Exacto ceil(log2(n) ) de Preguntas de “SI” o “NO”

0, 1, 2,…, X, X+1,…, n - 1
DEMO EN MATLAB
(GuessingAnIntegerNumber.m)

(log2(n))
Ejemplo 6: Cracking por Fuerza Bruta de una Clave
Binaria de Longitud n

DEMO EN MATLAB
(CrackingPasswords.m)

(2 )
n
PROBLEMAS A
ENFRENTAR AL
MOMENTO DE
SELECCIONAR
ALGORITMOS
Problemas para Seleccionar un Algoritmo:
Tamaño de los Datos

Fuente: http://www.math.ucla.edu/~wittman/10b.1.10w/Lectures/Lec3.pdf
Problemas para Seleccionar un Algoritmo:
Limitaciones de Memoria

Fuente: http://www.math.ucla.edu/~wittman/10b.1.10w/Lectures/Lec3.pdf
Problemas para Seleccionar un Algoritmo:
Tiempo de Implementación (Programación)

Fuente: http://www.math.ucla.edu/~wittman/10b.1.10w/Lectures/Lec3.pdf
Problemas para Seleccionar un Algoritmo:
Calidad de la Solución

Fuente: http://www.math.ucla.edu/~wittman/10b.1.10w/Lectures/Lec3.pdf
Problemas Computacionales tipo P, NP,
NP-hard y NP-completos (1)
Problemas tipo P (tiempo polinómico): Son todos los problemas que se pueden
resolver con algoritmos cuya función de complejidad está acotada superiormente por
una función polinómica, O(nk) con k. Es decir, son problemas donde el cálculo y la
verificación de una solución se realizan en tiempo polinómico.

Problemas tipo NP (tiempo polinómico no determinístico): Son problemas para los


cuales, hasta el momento, no se ha podido encontrar un algoritmo eficiente (con una
complejidad polinómica, O(nk) con k) para resolverlos. Sin embargo, si se propone
una solución, la validez de dicha solución se puede verificar en un tiempo polinómico.
Para este tipo de problemas, el método que permite encontrar la solución óptima es
la búsqueda exhaustiva. También se ha propuesto una serie de algoritmos que,
usualmente, permiten calcular soluciones sub-óptimas Se cumple que P  NP.

Problemas tipo NP-hard: Un problema B es del tipo NP-hard si cada problema del
tipo NP puede ser reducido a B en un tiempo polinómico. Los problemas del tipo NP-
hard son al menos tan difíciles como los problemas del tipo NP. Los problemas NP-
hard no están necesariamente contenidos en el tipo NP.

Problemas tipo NP-completo: Son problemas donde se cumple que NP  NP-hard.


Clasificación de Problemas en Ciencias de la
Computación
The halting
problem
Chess / go
Given an equation, stategies
does it have an
integer solution?

Map
coloring

Fuente: http://princetonacm.acm.org/downloads/PvsNP.pdf
Problema P versus NP (2)

➢ P vs NP: Si es fácil comprobar que una solución para un problema es correcta, entonces
¿es también fácil resolver dicho problema?

➢ La mayoría de científicos que trabajan en esta área creen que P  NP. Sin embargo,
nadie ha podido demostrar que esto sea cierto hasta el momento.

➢ Si Usted logra contestar la pregunta de P vs NP ganará 1M de dólares y su nombre


trascenderá en la historia de la humanidad.

Links: http://www.claymath.org/millennium-problems
http://www.claymath.org/millennium-problems/p-vs-np-problem
¿Qué Pasaría si P = NP?

Fuente: http://princetonacm.acm.org/downloads/PvsNP.pdf
El Problema de la Suma de Subconjuntos (1)

SubsetSumProblemExhaustive.m
Fuente: http://www.math.ucla.edu/~wittman/10b.1.10w/Lectures/Lec3.pdf
El Problema de la Suma de Subconjuntos (2)

SubsetSumProblemApproximation.m

Fuente: http://www.math.ucla.edu/~wittman/10b.1.10w/Lectures/Lec3.pdf
El Problema de la Suma de Subconjuntos (3)

TimeComplexitySubsetSumProblem.m

Fuente: http://www.math.ucla.edu/~wittman/10b.1.10w/Lectures/Lec3.pdf
El Problema de la Suma de Subconjuntos (4)

Fuente: http://www.math.ucla.edu/~wittman/10b.1.10w/Lectures/Lec3.pdf
DEBER PARA LA
PRÓXIMA
CLASE
Para la próxima clase resolver los siguientes
ejercicios (1)
Encontrar  para el algoritmo “merge and sort” R: n*log2(n)

Para valores de n grandes, ¿Cuál es le mejor método para ordenar una secuencia
de números enteros, el método de la burbuja o “merge and sort”? Justifique su
respuesta.
Para la próxima clase resolver los siguientes
ejercicios (2)
Para la próxima clase resolver los siguientes
ejercicios (3)
Resolver los siguientes ejercicios (4)

Sea una secuencia de n números representada computacionalmente mediante un


arreglo S (ver figura). Encontrar, analíticamente, el número promedio de
comparaciones que tomaría encontrar un determinado elemento X del arreglo.

Ayuda: El tiempo promedio es el promedio de los tiempos que tomaría encontrar


X si éste estuviera en la posición 1, posición 2, etc. de S.

R: (n + 1)/2

S= S1 S2 S3 S4 S5 S6 S7 S8 … Sn
HASTA LA
PRÓXIMA
CLASE

También podría gustarte