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