01. Información de estructura de datos, complejidad temporal y complejidad espacial (algoritmo básico de estructura de datos)

marca de agua, tamaño_16, texto_QDUxQ1RP5Y2a5a6i, color_FFFFFF, t_100, g_se, x_10, y_10, shadow_90, type_ZmFuZ3poZW5naGVpdGk =Índice de conocimientos y materiales introductorios


Tabla de contenido


Información común

Complejidad del algoritmo

https://www.bigocheatsheet.com

Sitio de demostración dinámico

https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

https://visualgo.net/zh

estructura de conocimiento

5 características principales del algoritmo

Finito, exacto, entrada, salida, factibilidad

complejidad del tiempo:

La carga de trabajo computacional requerida para ejecutar el algoritmo.
En términos generales, un algoritmo informático es una función del tamaño del problema n, por lo que f(n)la complejidad del tiempo del algoritmo se registra comoT(n)=O(f(n))

Cuanto mayor es el problema, la tasa de crecimiento del tiempo de ejecución del algoritmo se relaciona positivamente con la tasa de crecimiento de f (n), que se denomina complejidad de tiempo asintomático (Complejidad de tiempo asimpótica)

Cálculo:

  • 1. La fórmula para calcular el número de veces
    1 + 2 + 3 + ... + n;
<? php 
$ suma = 0; 
para ($ i = 1; $ i <= $ n; $ i ++) { 
    suma + = $ i; 
} 
?>

Calcula n veces, la complejidad del tiempo es O (n)

  • 2. Utilice la constante 1 para reemplazar todas las constantes de suma en todo momento. Por ejemplo, O (3) se registra como O (1)
<? 
prueba de función php ($ n) { 
    echo $ n; 
    echo $ n; 
    echo $ n; 
} 
?>

O (3) se registra como O (1)

  • 3. En la función de número de operaciones modificado, solo
    se retiene el elemento de orden más alto n ^ 2 + n + 1 , que se registra como O (n ^ 2)
  • 4. Si el orden más alto existe y no es 1, elimine la constante
    2n ^ 2 + 3n + 1 multiplicada por este término y regístrelo como O (n ^ 2)
Orden constante: O (1) 
Orden lineal: O (n) 
Plano (Li) Orden cuadrado: O (n ^ 2), O (n ^ 3)
<? php 
$ suma = 0; 
para ($ i = 1; $ i <= $ n; $ i ++) { 
    para ($ j = 1; $ j <= $ n; $ j ++) { 
        $ suma + = $ j; 
    } 
} 
?>

Bucle de dos capas O (n ^ 2) Tres capas O (n ^ 3)
orden cuadrado especial: O (n ^ 2/2 + n / 2) -> O (n ^ 2)

para () { 
    para () { 
        
    } 
} 

para () { 

} 
echo $ a + $ b;

n^2+n+1->O(n^2)

Orden logarítmico

$ i = 1; $ n = 100; 
while ($ i <$ n) { 
    $ i = $ i * 2; 
}
2 ^ x = n  

x = \ log_2 ^ n 

\ log_2 ^ n = \ log_2 ^ {10} \ log {n}
3 ^ x = n 

x = \ log_3 ^ n 

\ log_3 ^ n = \ log_3 ^ {10} * \ log {n}

Peor de caso: el tiempo de ejecución en el peor de los casos, una garantía, si no hay una descripción especial, la complejidad de tiempo mencionada es la complejidad de tiempo en el peor de los casos.

Caso promedio: tiempo de ejecución esperado

Complejidad espacial: el espacio de memoria consumido por el algoritmo, denotado como S (n) = O (f (n))

  • Incluido el espacio ocupado por el código del programa
  • El espacio ocupado por los datos de entrada y
  • Espacio ocupado por variables auxiliares

Estos 3 aspectos

Los métodos de cálculo y representación son similares a la complejidad del tiempo, y generalmente están representados por la progresividad de la complejidad.

Análisis de complejidad del tiempo

1. Céntrese únicamente en el código con más ejecuciones de bucle

Big O Este método de representación de la complejidad solo muestra una tendencia de cambio.

Por lo general, ignoramos las constantes, el orden inferior y los coeficientes en la fórmula, y solo necesitamos registrar la magnitud del orden más grande. Entonces, cuando analizamos la complejidad temporal de un algoritmo o un fragmento de código, solo prestamos atención al fragmento de código que tiene la mayor cantidad de tiempos de ejecución de bucle.

C es una constante, ¿por qué se puede omitir C? 

Cn ^ 2 
C (n + 1) ^ 2-Cn ^ 2 = C (2n + 1) 
(n + 1) ^ 2-n ^ 2 = 2n + 1

2. La regla de la suma: la complejidad total es igual a la complejidad del código de mayor magnitud.

3. La regla de la multiplicación: la complejidad del código anidado es igual al producto de la complejidad del código dentro y fuera del nido.

Análisis de complejidad espacial

El nombre completo de complejidad de tiempo es complejidad de tiempo progresiva , que representa la relación de crecimiento entre el tiempo de ejecución de un algoritmo y la escala de datos . Por analogía, el nombre completo de complejidad espacial es complejidad espacial asintótica (complejidad espacial asintótica), que representa la relación de crecimiento entre el espacio de almacenamiento de un algoritmo y la escala de datos .

impresión vacía (int n) { 
  int i = 0; 
  int [] a = nuevo int [n]; 
  para (i; i <n; ++ i) { 
    a [i] = i * i; 
  } 

  para (i = n-1; i> = 0; --i) { 
    imprime un [i] 
  } 
}

Al igual que el análisis de complejidad temporal, en la segunda línea de código, solicitamos un espacio para almacenar la variable i, pero es de orden constante y no tiene nada que ver con el tamaño de los datos n, por lo que podemos ignorarlo. La línea 3 se aplica a una matriz de tipo int de tamaño N. Además, el resto del código no ocupa más espacio, por lo que la complejidad de espacio de todo el código es O (n).

Imagen tomada de: https://time.geekbang.org/column/article/40036

Supongo que te gusta

Origin blog.51cto.com/huangkui/2677732
Recomendado
Clasificación