Notación sintótica
Asíntota
Se le llama asíntota a una línea recta que se aproxima
continuamente a otra función o curva; es decir que la
distancia entre las dos tiende a cero, a medida que se
extienden indefinidamente.
También se puede decir que es la curva la que se aproxima
continuamente a la recta; o que ambas presentan un
comportamiento asintótico.
Dominio asintótico
Sean 𝑓 y 𝑔 funciones de ℕ a ℝ. Se dice que 𝑓 domina
asintóticamente a 𝑔 o que 𝑔 es dominada asintóticamente
por 𝑓; si ∃𝑘 ≥ 0 𝑦 𝑚 ≥ 0 tales que:
En otros términos, podemos decir que si una función domina a
otra, su velocidad de crecimiento es mayor o igual.
Puesto que las funciones complejidad son funciones con dominio
ℕ(𝑛ú𝑚𝑒𝑟𝑜𝑠 𝑛𝑎𝑡𝑢𝑟𝑎𝑙𝑒𝑠), y contra dominio ℝ 𝑛ú𝑚𝑒𝑟𝑜𝑠 𝑟𝑒𝑎𝑙𝑒𝑠;
los conceptos y las propiedades de dominio asintótico
proporcionan una manera conveniente de expresarlas y
manipularlas.
Gráficas de las funciones 𝑚 |𝑓(𝑛)| y |𝑔(𝑛)| ,donde 𝑘 es el valor a
partir del cual 𝑚 |𝑓(𝑛)| es mayor que |𝑔(𝑛)| y esta relación de
magnitud se conserva conforme 𝑛 crece.
Ejemplo 1.
Sean 𝑓 𝑛 = 𝑛 y 𝑔 𝑛 = 𝑛^3
funciones de ℕ a ℝ.
1. Demostrar que 𝑔 domina asintóticamente a 𝑓
∃𝑚 ≥ 0, 𝑘 ≥ 0 𝑡𝑎𝑙𝑒𝑠 𝑞𝑢𝑒 |𝑓(𝑛)| ≤ 𝑚 |𝑔 (𝑛) |, ∀𝑛 ≥ k
2.Demostrar que 𝑓 no domina asintóticamente a 𝑔
¬(∃𝑚 ≥ 0, 𝑘 ≥ 0 𝑡𝑎𝑙𝑒𝑠 𝑞𝑢𝑒 |𝑔( 𝑛)| ≤ 𝑚 |𝑓 (𝑛)| , ∀𝑛 ≥ 𝑘)
1.Substituyendo 𝑓(𝑛) y 𝑔(𝑛)
|𝑛| ≤ m |𝑛^31 , ∀𝑛 ≥ k
Si se toman 𝑚 = 1 y 𝑘 = 1, las desigualdades anteriores se cumplen,
por lo tanto, 𝑚 y 𝑘 existen, y en consecuencia 𝑔 domina
asintóticamente a 𝑓.
2.Aplicando la negación se tiene
∀𝑚 ≥ 0, 𝑘 ≥ 0, ∃𝑛 ≥ 𝑘 𝑡𝑎𝑙 𝑞𝑢𝑒 |𝑔(𝑛)| > 𝑚| 𝑓(𝑛)|
Sustituyendo g y f en cada lado de lla desigualdad
|𝑛^3| > 𝑚|n|
Simplificando
|n^2| > m
n^2 > m
𝒏 > 𝒎^1/2 y 𝐧 ≥ k
Si se toma 𝒏 > 𝐦𝐚𝐱 (𝒎^1/2, 𝒌) ambas desigualdades se cumplen para
toda 𝑚 ≥ 0 𝑦 𝑘 ≥ 0, ∴ 𝑓 𝑛𝑜 𝑑𝑜𝑚𝑖𝑛𝑎 𝑎𝑠𝑖𝑡ó𝑡𝑖𝑐𝑎𝑚𝑒𝑛𝑡𝑒 𝑎 g
Ejemplo 2.
Sea 𝑔(𝑛) una función de ℕ a ℝ y 𝑓(𝑛) =
𝑐𝑔(𝑛) 𝑐𝑜𝑛 𝑐 > 0 𝑦 𝑐 ∈ ℝ.
1. Demostrar que 𝑓 d. a. g
∃𝑚 ≥ 0, 𝑘 ≥ 0 𝑡𝑎𝑙𝑒𝑠 𝑞𝑢𝑒 |𝑔(𝑛)| ≤ 𝑚 |𝑐𝑔 (𝑛)| , ∀𝑛 ≥ k
2. Demostrar que g d.a.f
∃𝑚 ≥ 0, 𝑘 ≥ 0 𝑡𝑎𝑙𝑒𝑠 𝑞𝑢𝑒 𝑐𝑔 𝑛 ≤ 𝑚 𝑔 𝑛 , ∀𝑛 ≥ k
1. Esto es
𝑐 |𝑔(𝑛)| ≤ 𝑚|𝑔(𝑛)| , ∀𝑛 ≥ k
Tomando 𝑚 = 𝑐 𝑦 𝑘 = 0 se tiene
𝑐 𝑔(𝑛) ≤ 𝑐|𝑔(𝑛)| , ∀𝑛 ≥ 0 ∴ 𝑔 𝑑. 𝑎. f
Dominio asintótico a la función complejidad
Cuando se hace el análisis teórico para obtener la función
complejidad 𝑓(𝑛) que caracterice a un algoritmo, se está
obteniendo un modelo de comportamiento para la demanda
de recursos en función del parámetro 𝑛; de tal forma que si
𝑡(𝑛) es la cantidad real del recurso que se consume para una
implantación específica del algoritmo se tiene que:
𝑡 (𝑛) 𝛼 𝑓 (n)
t (n) = c f(n)
|t(n)| ≤ c | f(n)|
i.e. 𝒇(𝒏) domina asintóticamente a cualquier 𝒕(𝒏); dicho de otra
manera la demanda de recursos se va a regir por el modelo de
crecimiento que observe 𝑓(𝑛).
Notación asintótica
El interés principal del análisis de algoritmos radica en saber
cómo crece la demanda de recursos, cuando el tamaño del
problema 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
La notación asintótica captura el comportamiento de la
función para valores grandes de 𝒏. Se consideran las
funciones asintóticamente no negativas
Las notaciones no son dependientes de los tres casos
anteriormente vistos, es por eso que una notación que
determine el peor caso puede estar presente en una o en
todas las situaciones.
Notación de orden
Cuando describimos cómo es que el número de operaciones
𝑓(𝑛) depende del tamaño 𝑛 ; lo que nos interesa es
encontrar el patrón de crecimiento o cota para la función
complejidad y así caracterizar al algoritmo; una vez hecha
esta caracterización podremos agrupar las funciones de
acuerdo al número de operaciones que realizan
Cota Superior: Notación O mayúscula
La notación O (Omicron mayúscula) se utiliza para comparar
funciones. Dada una función 𝑓, se desea estudiar funciones 𝑔 que
a lo sumo crezcan tan deprisa como 𝑓.
Definición: Sean 𝑓 y 𝑔 funciones de ℕ a ℝ. Si existen constantes 𝑐
y 𝑥0 tales que:
∀ x > 𝑥0, | f (x) | ≤ 𝑐 | g (x) |
i.e. que para 𝑥 > 𝑥0, 𝑓 es menor o igual a un múltiplo 𝑐 de 𝑔,
decimos que:
𝑓 𝑥 = 𝑂 (𝑔(x))
La definición formal es:
𝒇 𝒙 = 𝑶 𝒈 𝒙 ⇔ ∃𝑐 > 0, 𝑥0 > 0 | ∀ x > 𝑥0, | f (𝑥) | ≤ 𝑐| g (𝑥) |
Ejemplo 3.
Muestre que 𝑓𝑡 (n) = 3𝑛^3 + 5n^2 + 9 = 𝑂 (𝑛^3)
Sustituyendo
|3𝑛
3 + 5𝑛
2 + 9| ≤ 𝑐|𝑛
3
|
Como ambas funciones van de ℕ a x y 𝑥0>0, y desde 𝑥0=0 no negativa
3𝑛^3 + 5𝑛^2 + 9 ≤ 𝑐𝑛3
Agrupando
5𝑛^2 ≤ (𝑐 − 3) 𝑛^3 − 9
Cota Superior no ajustada: Notación o minúscula
La cota superior asintótica dada por la notación 𝐎 puede o no ser
ajustada asintóticamente. La cota 2n² = O(n²) es ajustada
asintóticamente, pero la cota 2n = o(n²) no lo es. Se emplea la
notación o para denotar una cota superior que no es ajustada
asintóticamente.
Definición: Sean 𝑓 y 𝑔 funciones de ℕ a ℝ. Si para toda constante
𝑐 > 0 y una constante 𝑥0 se cumple que:
∀ x > 𝑥0, 𝑐 > 0 , f (x) | ≤ 𝑐 | g (x) |
i.e. que para 𝑥 > 𝑥0, 𝑓 es menor o igual a todos los múltiplos 𝑐 >
0 de 𝑔, decimos que:
𝑓 (x)= o (g(x))
la definición formal es:
𝒇 (𝒙) = 𝒐 (𝒈 (𝒙)) ⇔ ∃𝑥0 > 0 |∀ x > 𝑥0, c > 0, f (𝑥) | ≤ 𝑐| g (𝑥) |
Diferencia entre O y o
Las notaciones de 𝑶 y 𝒐 son similares. La diferencia principal es, que en
𝑓(𝑛) = 𝑶(𝑔(𝑛)), la cota 0 ≤ 𝑓(𝑛) ≤ 𝑐𝑔(𝑛) se cumple para alguna
constante 𝑐 > 0 , pero en 𝑓(𝑛) = 𝒐(𝑔(𝑛)), la cota 0 ≤ 𝑓(𝑛) ≤
𝑐𝑔(𝑛) se cumple para todas las constantes 𝑐 > 0.
Intuitivamente en la notación 𝒐, la función 𝑓(𝑛) se vuelve insignificante
con respecto a 𝑔(𝑛) a medida que 𝑛 se acerca a infinito
Para 𝑜 la desigualdad se mantiene para todas las constantes positivas,
mientras que para 𝑂 la desigualdad se mantiene sólo para algunas
constantes positivas.
Cota Inferior: Notación Ω
La notación Ω Es el reverso de 𝑂, i.e es una función que sirve de
cota inferior de otra función cuando el argumento tiende a infinito
Cota ajustada asintótica: Notación Θ
La cota ajustada asintótica o de orden exacto es una función que
sirve de cota tanto superior como inferior de otra función cuando
el argumento tiende a infinito.
Observaciones sobre las cotas asintóticas
1. La utilización de las cotas asintóticas para comparar
funciones de tiempo de ejecución se basa en la hipótesis de
que son suficientes para decidir el mejor algoritmo,
prescindiendo de las constantes de proporcionalidad. Sin
embargo, esta hipótesis puede no ser cierta cuando el
tamaño de la entrada es pequeño.
2.Para un algoritmo dado se pueden obtener tres funciones
que miden su tiempo de ejecución, que corresponden a sus
casos mejor, medio y peor, y que denominaremos
respectivamente Tm(n), T1/2
(n) y Tp
(n), para cada una de
ellas podemos dar hasta 4 cotas asintóticas (O, o, Ω, Θ) de
crecimiento, por lo que se obtiene un total de 12 cotas para
el algoritmo.
3.Para simplificar, dado un algoritmo diremos que su orden de
complejidad es O(f) si su tiempo de ejecución para el peor
caso es de orden O de f, es decir, Tp
(n) es de orden O(f). De
forma análoga diremos que su orden de complejidad para el
mejor caso es Ω(g) si su tiempo de ejecución para el mejor
caso es de orden Ω de g, es decir, Tm(n), es de orden Ω(g).
4.Por último, diremos que un algoritmo es de orden exacto
Θ(f) si su tiempo de ejecución en el caso medio T1/2
(n) es
de este orden.
Ordenes de complejidad (Cota superior)
Dado que las funciones complejidad están en el conjunto de
funciones que van de de ℕ a ℝ; es posible clasificar los
algoritmos según el orden de su función complejidad. Gran
parte de los algoritmos tienen complejidad que cae en uno
de los siguientes casos:
- 𝑶(𝟏) Complejidad constante
- 𝑶(log𝒏) Complejidad logarítmica
- 𝑶(𝒏) Complejidad lineal
- 𝑶(𝒏 log𝒏) Complejidad “n log n”
- 𝑶(𝒏 𝟐 ) Complejidad cuadrática
- 𝑶(𝒏 𝟑 ) Complejidad cubica
- 𝑶 (𝒄^𝒏) ; 𝒄 > 𝟏 Complejidad exponencial
- 𝑶(𝒏!) Complejidad factorial
𝒇 (𝒏 )= 𝑶 (𝟏) Complejidad constante
Los algoritmos de complejidad constate ejecutan siempre el mismo
numero de pasos sin importar cuan grande es n
𝒇 (𝒏) = 𝑶 (log 𝒏) Complejidad logarítmica
Los algoritmos de complejidad logarítmica, habitualmente son
algoritmos que resuelven un problema transformándolo en
problemas menores.
𝒇 (𝒏) = 𝑶 (𝒏) Complejidad lineal
Los algoritmos de complejidad lineal generalmente tratan de
manera constante cada n del problema por lo que si n dobla su
tamaño el algoritmo también dobla el número de pasos.
𝒇 (𝒏) = 𝑶 (𝒏 log 𝒏) Complejidad “n log n”
Los algoritmos de complejidad “n log n” generalmente dividen un
problema en problemas más sencillos de resolver para finalmente
combinar las soluciones obtenidas.
𝒇 (𝒏) = 𝑶(𝒏^𝟐
) Complejidad cuadrática
Los algoritmos de complejidad cuadrática aparecen cuando los
datos se procesan por parejas, en la mayoría de los casos en bucles
anidados.
𝒇 (𝒏) = 𝑶(𝒏^𝟑
) Complejidad cubica
Los algoritmos de complejidad cubica son útiles para resolver
problemas pequeños p.g. si n=100 el número de operaciones es de
1,000,000.
𝑶 (𝒄^𝒏) ; 𝒄 > 𝟏 Complejidad exponencial
Los algoritmos de complejidad exponencial no son útiles desde el
punto de vista practico, aparecen cuando un problema se soluciona
empleando fuerza bruta.
𝑶(𝒏!) Complejidad factorial
Un algoritmo de complejidad factorial generalmente aparece
cuando el problema también es resuelto por fuerza bruta y es un
problema complejo por definición; o cuando se maneje de mala
manera un algoritmo recursivo
Comentarios
Publicar un comentario