Complejidad computacional - doapps/software GitHub Wiki

Banner

Contenidos

  1. Complejidad computacional
  2. Clasificación de problemas
  3. Órdenes de complejidad
  4. Conclusiones

Complejidad computacional

  • Se centra en la clasificación de los problemas computacionales de acuerdo a su dificulta
  • La complejidad se mide en relación al tiempo(procesamiento) y espacio(memoria).

Clasificación de problemas

P Los problemas clase P son aquellos que pueden ser abordados durante la práctica y tratados mediante el uso de una máquina determinista en tiempo polinómico

NP problemas intratables Esta característica lleva a un método de resolución no determinista consistente en aplicar heurísticos para obtener soluciones hipotéticas que se van desestimando (o aceptando) a ritmo polinómico.

NP Completos no cuentan con un algoritmo capaz de darles solución

La clasificación clásica de los problemas en relación a su complejidad se limitaba a los tipos P y NP.

Con el pasar de los años esta clasificación se ha ampliado y podemos ver ahora clasificaciones como el NP Hard.

Considerar lo siguiente:

  • Funciones polinómicas VS exponenciales

  • También pueden revisar el test de primalidad.

  • Computación clásica <> Computación cuántica Recordar que la computación clásica está basada en bits cuyos estados son 0 y 1. Sin embargo en el esquema de la computación cuántica la únidad mínima es Qubit el cual puede tener múltiples valores complejos con lo que se podría vencer la barrera de las limitaciones de procesos computacionales asociados a problemas del tipo NP.

Pueden leer más sobre computación cuántica aquí.

Órdenes de complejidad

Hablamos de la función O(g) para referirnos a la función que determina el orden de complejidad de un determinando algoritmo.

En concreto O(g) será una función que estima la tasa de crecimiento asociada al número de operaciones que son necesarias realizar en un algoritmo determinado.

---

Los órdenes de complejidad más conocidos se presentan en la siguiente tabla:

Orden Nombre
O(1) constante
O(log n) logarítmica
O(n) lineal
O(n log n) casi lineal
O(n²) cuadrática
O(n³) cúbica
O(a^n) exponencial

Ejemplo de función con complejidad lines O(n)

Imaginemos que función suma(n) es la suma de los números de 1 hasta n.

Por ejemplo, suma(5) == 15

suma :: Integer -> Integer

suma 0 = 0

suma n = n + suma (n-1) 

El tiempo necesario para calcular (suma n) para n en [1000,2000..8000] se recoge en la siguiente tabla

n segs
1000 0.02
2000 0.03
3000 0.04
4000 0.04
5000 0.05
6000 0.06
7000 0.07
8000 0.08

En la tabla se observa que hay una relación lineal entre n y el tiempo necesario para calcular (suma n):

tiempo(suma n) ≈ n * 0.00001

Las ecuaciones para calcular T(n) son

T(1)   = 1

T(n+1) = 1 + T(n)

Demostración de que suma ∈ O(n) (es decir, es de coste lineal)

Basta comprobar que T(n) = n cumple las ecuaciones del coste de la función suma.

T(1)   = 1       [por definición de T]

T(n+1) = 1+T(n)  [por definición de T]

       = 1+n     [por hipótesis de inducción]
   
       = n+1     [por álgebra]

Conclusiones

Se entiende que la complejidad de un problema está directamente relacionado a la cantidad de recursos computacionales que requiere para dicho problema para ser resuelto. Es importante tener claro que una función exponencial representa el crecimiento de la demanda de tiempo y espacio que necesita el problema para ser resuelto lo que representa una situación poco favorable, por el contrario una función logarítmica, lineal o similares representa un crecimiento dentro de los parámetros normales.

Fuentes

Fuentes recomendadas para siguiente clase

⚠️ **GitHub.com Fallback** ⚠️