Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Temas
Teoría de la Complejidad
Análisis de Algoritmos
Complejidad temporal y espacial
Funciones Matemáticas
Ordenes
Notación Asintótica
Principios para determinar el orden de un algoritmo
Objetivo
Que el estudiante logre:
Entender los fundamentos de la Teoría de la Complejidad.
Medir la eficiencia de algoritmos.
Diferenciar entre los algoritmos de complejidad polinómica y no
polinómica.
16:23 11
¿Qué es un algoritmo?
Un algoritmo es una serie finita de pasos para resolver un problema.
¿Qué condiciones debe satisfacer?
16:23 33
La leyenda sobre el tablero de ajedrez
Mucho tiempo atrás, el visir Sissa ben Dahir inventó el juego del ajedrez para el
rey Shirham de la India. El rey ofreció a Sissa la posibilidad de elegir su propia
recompensa. Sissa le dijo al rey que podía recompensarle: o bien con una
cantidad equivalente a la cosecha de trigo en su reino de dos años, o bien con
una cantidad de trigo que se calcularía de la siguiente forma:
El rey pensó que la primera posibilidad era demasiado cara mientras que la
segunda, medida además en simples granos de trigo, daba la impresión de serle
claramente favorable. Así que sin pensárselo dos veces pidió que trajeran un
saco de trigo para hacer la cuenta sobre el tablero de ajedrez y recompensar
inmediatamente al visir.
16:23 44
El número de granos en la primera fila resultó ser:
20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 = 255
La cantidad de granos en las dos primeras filas es:
Al llegar a la tercera fila el rey empezó a pensar que su elección no había sido
acertada, pues para llenar las tres filas necesitaba:
16:23 77
ANÁLISIS DE UN ALGORITMO EN PARTICULAR: se trata de
investigar el costo de usar un determinado algoritmo para resolver
un problema específico.
TIPO DE
ANÁLISIS
ANÁLISIS DE UNA CLASE DE ALGORITMOS: se investiga
toda una familia de algoritmos que permiten resolver un problema,
procurando obtener él que demande menor costo
ESTIMACIÓN A PRIORI
Hace uso de un modelo matemático, como lo es una función,
basada en un computador idealizado y en un conjunto de
operaciones con costos de ejecución perfectamente especificados.
SEGÚN EL Proporciona sólo un RESULTADO APROXIMADO.
MOMENTO
COMPROBACIÓN A POSTERIORI
Se lleva a cabo en el momento de la ejecución del programa en un
computador y consiste en medir los tiempos de corrida del
programa en cuestión.
Proporciona VALORES REALES.
16:23 88
LA COMPLEJIDAD DE UN ALGORITMO ES UNA MEDIDA DE LA
CANTIDAD DE RECURSOS (TIEMPO, MEMORIA) QUE EL ALGORITMO
REQUIERE.
COMPLEJIDAD EN TIEMPO
COMPLEJIDAD EN ESPACIO
16:23 99
COMPLEJIDAD TEMPORAL (ESPACIAL).
Tiempo (o espacio) requerido por un algoritmo,
expresado en base a una función que depende del tamaño del
problema.
16:23 10
10
Para evaluar la rapidez o viabilidad de un algoritmo (eficiencia) se imagina
que al algoritmo se le suministra entradas cada vez mayores y se observa
la razón de crecimiento del tiempo insumido para ejecutarlo.
Para analizar esto se consideran dos tipos de funciones matemáticas:
FUNCIÓN
16:23 11
11
El objetivo primario del estudio de la complejidad es definir cuáles
problemas son tratables y cuáles no, para luego considerar distintos
grados de tratabilidad.
16:23 13
13
Ejemplo 1(search): problema de pertenencia a un conjunto.
Complejidad en tiempo: T = T1 + T2
donde T1 es el tiempo insumido fuera del ciclo while y T2 es el tiempo
dentro de éste. Se observa que T1 es un valor constante (h) que no
depende del conjunto X, en cambio T2 depende de él, así:
T = h + T2 (X)
16:23 15
15
Para diferenciar la eficiencia de los algoritmos se utilizan los
órdenes de complejidad. Éstos se expresan en función de n que
representa el tamaño (dado o estimado) de los datos de entrada.
16:23 18
18
El interés principal del análisis de algoritmos radica en saber
cómo crece el tiempo de ejecución, cuando el tamaño de la
entrada crece. Esto es la eficiencia asintótica del algoritmo.
Se denomina “asintótica” porque analiza el comportamiento de
las funciones en el límite, es decir, su tasa de crecimiento.
16:23 19
19
Notación “O grande” (O mayúscula) (Omicron, "Big-
O") : se utiliza para manejar la cota superior del tiempo de
ejecución.
Notación “o minúscula”: denotar una cota superior que
no es ajustada asintóticamente.
16:23 20
20
Notación “O grande” (O(f)), denota el conjunto de las funciones
g que crecen a lo sumo tan rápido como f (es decir, f llega a ser en
algún momento una cota superior para g).
Formalmente:
g(n)=Ω(f(n))
La función n² puede ser acotada inferiormente por la función n. Para
demostrarlo basta notar que para todo valor de n≥1 se cumple n≤n².
Por tanto n² = Ω(n) (sin embargo, n no sirve como cota inferior para
n²).
g(n)= Θ (f(n))
La función n +10 puede ser acotada por la función n. Para demostrarlo
basta notar que para todo valor de n ≥1 se cumple g(n)≤ h(n) ≤11g(n).
Por tanto n+10 = Θ(x).
La función n²+200 n está acotada de forma ajustada por n². Quiere
decir que cuando n tiende a infinito el valor de 200 n se puede despreciar
con respecto al de n².
24
DEFINICIÓN 1: Sean g, f dos funciones de números naturales a
números reales. La función g es O(f(n)) si y sólo si existe una constante
real c > 0 tal que:
g ( n)
lim c
n f ( n)
lim g( n) 0
n f ( n)
Similarmente, O (g(n)) > O (f(n)) si y sólo si
lim g( n)
n f ( n)
variable = 3.141592
variable = a +b
etc.
16:23 26
26
Secuencia de comandos
sentencia 1
sentencia 2
...
sentencia s
o lo que es lo mismo:
16:23 27
27
Instrucción de bifurcación
si expresión entonces
bloque de sentencias
si no
otro bloque de sentencias
fin si
16:23 28
28
Estructura repetitiva:
16:23 29
29
Ejemplo 1:
1. El tamaño del problema viene definido en
desde i=1 a n
este caso por la variable n.
desde j=1 a n
2. Se va a la zona más interna del bucle
escribir i+j
(escribir i+j).
fin desde
3. Se trata de una sentencia elemental, por
fin desde
tanto, su tiempo de ejecución será de orden
O(1).
4. El bucle más interno (desde j=1 a n) se
ejecuta n veces y su cuerpo tiene
complejidad O(1), por tanto, este bucle
tiene complejidad O(n·1)=O(n).
5. El bucle más externo (desde i=1 a n) se
ejecuta n veces y su cuerpo (el bucle
anterior) tiene complejidad O(n), por tanto,
este bucle (y el algoritmo) tiene complejidad
O(n·n)=O(n2).
16:23 30
30
Ejemplo 2:
1. El tamaño del problema viene definido en este caso
f=1 por la variable n.
2. Se va a la zona más interna del bucle (f=f·i).
desde i=1 a n
3. Se trata de dos sentencias elementales (producto y
f=f·i asignación), por tanto, su tiempo de ejecución será de
fin desde orden O(1).
4. El bucle (desde i=1 a n) se ejecuta n veces y su cuerpo
tiene complejidad O(1), por tanto, este bucle (y el
algoritmo que permite calcular el factorial de n) tiene
complejidad O(n·1)=O(n).
Las proposiciones (4), (5) y (6) toman O(1), por la regla de la suma O (max (1,1,1)) = O (1)
(1) El ciclo de las i se ejecuta n-1 veces
(2) El ciclo de las j se ejecuta n-i veces
n 1
T = (n i ) = n - 1 + n - 2 + ... + n - ( n - 1 ) = (n 2 - n) / 2
i 1
c O (g (n)) = O (f (n))
16:23 36
36