g(n) - LDC

Anuncio
Algoritmos y estructuras II
Análisis y complejidad
Prof. Diego Mosquera U.
Abril de 2008.
Orden de crecimiento
¿Qué es?
• Da una caracterización simple de la eficiencia
de un algoritmo.
– Simplifica el cálculo de la eficiencia:
• Encontrar fórmulas cerradas a veces es complejo: como
determinar la fórmula de una ecuación de recurrencia.
• Determinar el tiempo de corrida exacto de un algoritmo da
precisión extra que no vale el esfuerzo en la matemática
computacional.
• Como la eficiencia se estudia para entradas muy grandes al
algoritmo, las constantes multiplicativas y los términos de
orden inferior son dominados por el efecto del mismo
tamaño de la entrada.
¿Qué es?
Por ejemplo: Suponga que se tiene un
algoritmo cuyos tiempo de corrida está
dado por la expresión:
T(n) = 3n2 + 10n + 10
Cuantitativamente, los valores constantes
y los términos de orden inferior son
despreciables cuando n es grande.
Veamos:
¿Qué es?
Suponga que n = 10, entonces
– Tiempo de corrida para 3n2: 73,2%
– Tiempo de corrida para 10n: 24,4%
– Tiempo de corrida para 10: 2,4%
Ahora suponga que n = 100:
– Tiempo de corrida para 3n2: 96,7%
– Tiempo de corrida para 10n: 3,2%
– Tiempo de corrida para 10: <0,1%
Lo que significa que los términos de orden inferior es
precisión extra no necesaria. Lo mismo sucede con las
constantes multiplicativas cuando n es suficientemente
grande, por lo que el término importante es n2 (término
dominante de la ecuación).
¿Qué es?
• Cuando se eliminan las constantes y
términos menos significativos de la
expresión, entonces estamos estudiando
el orden de crecimiento del tiempo de
corrida del algoritmo. A esto se le llama
eficiencia asintótica del algoritmo.
– Se estudia el comportamiento de la función
de complejidad en el límite.
¿Qué es?
Conclusión #1:
– Podemos estudiar el comportamiento preciso del
tiempo de corrida de un algoritmo en función al
tamaño de la entrada.
– Podemos estudiar el comportamiento asintótico del
tiempo de corrida de un algoritmo en función al
tamaño de la entrada.
El segundo caso nos permite concluir cosas
como: f(n) = θ (g(n)), f(n) = O(g(n)), f(n) =
Ω(g(n)). Por lo que necesitamos una notación
precisa de cálculo.
¿Qué es?
Conclusión #2:
– Orden de crecimiento vs cálculo exacto
• θ (n2) vs n2 + 5n +1
• θ(n lg n) vs 50n lg n
– Orden de Crecimiento:
• Comportamiento asintótico
• Eficiencia en el limite.
Notación asintótica
¿Qué es?
• Sirve para describir el tiempo de corrida asintótico de un
algoritmo, que es una función con dominio en los
números naturales N = {0,1,2,…}
T(n) : N -> R≥0
• Tales notaciones permiten describir la función del tiempo
de corrida T(n) en el peor de los casos.
• Ejemplos:
–
–
–
–
–
Ordenamiento por inserción: T(n) = θ (n2)
Ordenamiento por mezcla: T(n) = θ (n logn)
Búsqueda lineal: T(n) = O(n)
Búsqueda binaria: T(n) = O(logn)
…
Notación Theta (θ)
• Llamada orden exacto
• Para una función dada g(n), denotamos
por θ(g(n)) al conjunto de funciones:
θ(g(n)) = {f(n) | ∃c1,c2∈R+, ∃n0∈N :
0 ≤c1g(n)≤f(n) ≤ c2g(n), ∀ n≥n0 }
“Una función f(n) ∈
θ(g(n)) si existen dos constantes
reales positivas c1,c2 tales que f(n) esté acotada
inferiormente por c1g(n) y superiormente por c2g(n) para
un n suficientemente grande.”
Notación Theta (θ)
• Ejemplo #1: Probar que 1/2n2 – 3n = θ(n2)
Solución:
Existen muchas constantes c1 y c2. Lo
importante es conseguirlas a ambas (y
tratar que n0 sea lo más pequeño posible)
Generemos varias gráficas para ver qué
podemos obtener:
Notación Theta (θ)
– Gráfica #1: c1 = 1/3, c2 = 1
500
400
1/2n2 – 3n
300
200
100
5
10
15
20
Entonces,aproximadamente, n0 ≥ 19
25
30
Notación Theta (θ)
– Gráfica #2: c1 = 1/14, c2 = 1/2
25
1/2n2 – 3n
20
15
10
5
2
4
6
-5
Entonces,aproximadamente, n0 ≥ 7
8
10
Notación Theta (θ)
– Calculando esto, tenemos:
c1n2≤ 1/2n2 – 3n ≤ c2n2
=
<Dividiendo entre 2>
c1≤ 1/2 – 3/n ≤ c2
- Para n < 7 no se cumple que c1∈R+.
Por tanto, c1≤ 1/14 para n0 = 7
- Para n≥1 se cumple que c2∈R+.
Por tanto, c2 ≥ (c2 > 0, digamos c2 ≥ ½)
Por tanto para n0 = 7, c1=1/14 y c2=1/2, 1/2n2 – 3n ∈ θ(n2)
Notación Theta (θ)
• Ejemplo #2: Probar que 6n3 ≠ θ(n2)
Solución:
Nótese que c1 existe para n0 ≥ 0 . Aquí debemos probar
que c2 no existe.
Prueba por contradicción:
Suponemos que c2 y n0 existen, por lo que:
6n3 ≤ c2n2 para todo n ≥ n0
Pero entonces n ≤ c2/6, lo que no es necesariamente
cierto para un n suficientemente grande porque c2 es
constante. Entonces contradice el heho supuesto n ≥ n0
Notación O-grande (O)
• Notación para el orden superior ajustado
• La notación θ acota a una función por arriba y
por abajo. Cuando solo tenemos una cota
superior utilizamos la notación O-grande.
• Para una función dada g(n), denotamos por
O(g(n)) al conjunto de funciones:
O(g(n)) = {f(n) | ∃c∈R+, ∃n0∈N :
0 ≤f(n) ≤ cg(n), ∀ n≥n0 }
“Una función f(n) ∈
O(g(n)) si existe una constante real positiva c
tal que f(n) esté acotada superiormente por cg(n) para un n
suficientemente grande.”
Notación O-grande (O)
• Ejemplo: Probar que
27n2 + 355/113n + 12 = O(n2)
Solución:
Existen muchas constantes c Lo importante es
conseguir alguna (y tratar que n0 sea lo más
pequeño posible)
Generemos algunas gráficas para ver qué
podemos obtener:
Notación O-grande (O)
– Gráfica #1: c = 30
3´ 10
2.5 ´ 10
27n2 + 355/113n + 12
7
7
2´ 10 7
1.5 ´ 10 7
1´ 10 7
5´ 10
6
200
400
600
800
Entonces,aproximadamente, n0 ≥ 300
1000
Notación O-grande (O)
– Gráfica #2: c = 4762/113
27n2 + 355/113n + 12
4000
3000
2000
1000
2
4
6
Entonces,aproximadamente, n0 ≥ 1
8
10
Notación O-grande (O)
– Calculando esto, tenemos:
27n2 + 355/113n + 12 ≤ cn2
Sabemos que
27n2 + 355/113n + 12 ≤ 27n2 + 355/113n2 + 12n2
= <Cálculo>
27n2 + 355/113n + 12 ≤ (27 + 355/113 + 12)n2
= <Cálculo>
27n2 + 355/113n + 12 ≤ (4762/113)n2
- Para n≥1 se cumple que c∈R+.
Por tanto, c ≥ 4762/113
Por tanto
para n0 = 1, c= 4762/113, 27n2 + 355/113n + 12 ∈ O(n2)
Notación Omega-grande (Ω)
• Notación para el orden inferior ajustado
• Cuando solo tenemos una cota inferior
utilizamos la notación Ω -grande.
• Para una función dada g(n), denotamos por
Ω(g(n)) al conjunto de funciones:
Ω(g(n)) = {f(n) | ∃c∈R+, ∃n0∈N :
0 ≤ cg(n) ≤f(n) , ∀ n≥n0 }
“Una función f(n) ∈ Ω(g(n)) si existe una constante real positiva c tal
que f(n) esté acotada inferiormente por cg(n) para un n
suficientemente grande.”
Notación Omega-grande (Ω)
• Ejemplo: Probar que
sqrt(n) = Ω(log(n))
Solución:
Existen muchas constantes c Lo importante es
conseguir alguna (y tratar que n0 sea lo más
pequeño posible)
Generemos una gráfica para ver qué podemos
obtener:
Notación Omega-grande (Ω)
– Gráfica #1: c = 1
Sqrt(n)
6
4
2
10
20
30
40
-2
-4
-6
Entonces,aproximadamente, n0 ≥ 16
50
Teorema 1.1
Sean f(n):N->R+ y g(n) :N->R+ funciones,
entonces:
f(n) = O(g(n)) si y solo si f(n) = Ω(g(n))
Notación o-chica (o)
• La notación O-grande se utiliza para denotar
cotas superiores asintóticamente ajustadas:
2n2 = O(n2).
• Usamos o-chica para denotar una cota superior
que no es asintóticamente ajustada: 2n = o(n2).
• Entonces, para una función dada g(n),
denotamos por o(g(n)) al conjunto de funciones:
o(g(n)) = {f(n) | ∀ c∈R+, ∃n0>0∈N :
0 ≤f(n) < cg(n) , ∀ n≥n0 }
Notación o-chica (o)
• Así, 2n = o(n2), pero 2n2 ≠ o(n2)
• Vemos la similitud en la definición O y o.
La principal diferencia es que
f(n) = O(g(n)) se cumple para alguna
constante c real y positiva, mientra que
f(n) = o(g(n)) se cumple para toda
constante c real y positiva.
Notación o-chica (o)
• Intuitivamente, si f(n) = o(g(n)), entonces
f(n) es insignificante (despreciable ) frente
a g(n) en el infinito, que es:
Limn->∞ f(n)/g(n) = 0
Principio de dominancia de funciones
Notación o-chica (o)
• Ejemplo: Utilizando el principio de dominancia,
demuestre que loglogn = o(logn)
Solución:
Dado que ambas funciones tienden a infinito cuando n
tiende a infinito, Aplicamos la Regla de L’Hospital,
tenemos:
Limn->∞ loglogn/logn
= Limn->∞ [((1/n)(1/Ln2))/logn]/[[(1/n)(1/Ln2)]
= Limn->∞ 1/logn
=0
Teorema 1.2
Si g(n) y f(n) son funciones en los reales
positivos que crecen sin límites, entonces:
Si Ln(g(n)) = o(Ln(h(n))) entonces
h(n) = o(g(n))
Demostración del teorema[3,pg-151]
Notación o-chica (o)
• Ejemplo: Demuestre que nc = o(nlogn) para c > 1
Solución:
Aplicando el teorema 1.2, tenemos:
Limn->∞ cLnn/lognLnn
= Limn->∞ c/logn
=0
Notación ω-chica (ω)
• La notación Ω -grande se utiliza para denotar
cotas inferiores asintóticamente ajustadas.
• Usamos ω -chica para denotar una cota inferior
que no es asintóticamente ajustada:
n2 /2= ω(n).
• Entonces, para una función dada g(n),
denotamos por ω(g(n)) al conjunto de funciones:
ω(g(n)) = {f(n) | ∀ c∈R+, ∃n0>0∈N :
0 ≤ cg(n) < f(n) , ∀ n≥n0 }
Notación ω-chica (ω)
• Así, n2 /2= ω(n), pero n2 /2 ≠ ω (n2)
• Vemos la similitud en la definición Ω y ω.
La principal diferencia es que f(n) =
Ω(g(n)) se cumple para alguna constante c
real y positiva, mientra que f(n) = ω(g(n))
se cumple para toda constante c real y
positiva.
Notación ω-chica (ω)
• Intuitivamente, si f(n) = ω(g(n)), entonces
g(n) es insignificante (despreciable ) frente
a f(n) en el infinito, que es:
Limn->∞ f(n)/g(n) = ∞
Regla del límite
Dadas las funciones arbitrarias f y g : N->R≥0
tenemos:
•
•
•
Si Limn->∞ f(n)/g(n) ∈ R+, entonces f(n) = θ(g(n))
Si Limn->∞ f(n)/g(n) = 0, entonces f(n) = O(g(n)),
pero f(n) ≠ θ(g(n))
Si Limn->∞ f(n)/g(n) = + ∞, entonces f(n) = Ω(g(n)),
pero f(n) ≠ θ(g(n))
Demostración de la regla del límite[1,pg-97]
Regla del límite
Ejemplo: Demostrar por la regla del límite que
logn = O(sqrt(n))
Solución: Dado que ambas funciones tienden a
infinito cuando n tiende a infinito, se aplica la
regla de L’Hospital:
Limn->∞ logn/sqrt(n)
= Limn->∞ (1/n)/[1/(2sqrt(n))]
= Limn->∞ 2/sqrt(n)
=0
Reflexiones importantes
• Las funciones de complejidad de los algoritmos
se consideran funciones con dominio en N, pues
las entradas tendrán tamaños naturales:
–
–
–
–
Valor de un número del que se calcula el factorial,
Número de aros a mover en las Torres de Hanoi,
Número de datos a ordenar,
Número de nodos y aristas de un grafo (en este caso
la entrada es NxN , que es isomorfo a N)
Reflexiones importantes
• Las funciones de complejidad de los
algoritmos se consideran funciones con
rango R≥0 ,pues el tiempo de ejecución no
puede ser negativo.
• Sólo interesa lo que pase asintóticamente
(n>=n0), por lo que podríamos considerar
funciones no definidas en todo N o que
tomen valores negativos para algunos
valores de n.
Reflexiones importantes
• Para demostrar que T(n) no pertenece a
un orden específico, por ejemplo, que T(n)
≠ O(g(n)), puede utilizarse la regla del
límite, o puede hacerse por contradicción
basado en el supuesto de que la (s)
constante (s) existen y que el n0 existe.
Propiedades de las notaciones
asintóticas
PRÓXIMA CLASE
Referencias
• [1] Brassard G. y Bratley P. Fundamentos
de Algoritmia.
• [2] Cormen T., Leiserson C. and Rivest R.
Introduction to algorithms
• [3] Yriarte V. Elementos de la teoría
combinatoria.
Descargar