Consolidación | El análisis de complejidad de algoritmos más completo

Consolidación | El análisis de complejidad de algoritmos más completo

Prefacio

Este es un artículo del 20 de enero de 2019. La razón por la que lo volví a publicar hoy es porque creo que el análisis de complejidad del algoritmo es una habilidad básica del algoritmo introductorio. Hay un buen dicho: "Si no practicas artes marciales, terminarás en un callejón sin salida". También acabo de revisarlo. Si no lo uso a menudo, a veces lo olvido.

Otro punto es que, en el pasado, parece que no hay muchos artículos técnicos de animación, su redacción y producción requieren mucho tiempo, y este tiempo superará tu imaginación. Mi intención original no era apresurarme a terminar un artículo y publicarlo en una cuenta pública, esto es una irresponsabilidad para mí y para ti.

Así que todavía elijo reservar un poco más de tiempo para escribir bien y luego diseñar los diagramas para que sean más comprensibles. No quiero cambiarlo todos los días, pero solo quiero que cada artículo muestre mi mejor estado para compartir.

Consolidación | El análisis de complejidad de algoritmos más completo
Consolidación | El análisis de complejidad de algoritmos más completo
Consolidación | El análisis de complejidad de algoritmos más completo
Consolidación | El análisis de complejidad de algoritmos más completo
1. ¿Para qué se utiliza la estructura de datos?

El nacimiento de estructuras de datos y algoritmos permite a las computadoras "ejecutar más rápido" y "ahorrar espacio".

2. ¿Qué se utiliza para juzgar la calidad de las estructuras de datos y los algoritmos?

Juzgue la calidad de la estructura de datos y el algoritmo a partir de los dos aspectos de "tiempo de ejecución" y "espacio ocupado".


3. ¿Qué es la complejidad?

Utilice "complejidad de tiempo" y "complejidad de espacio" para describir problemas de desempeño, y ambos se denominan colectivamente complejidad.


4. ¿Qué describe la complejidad?

La complejidad describe la relación entre el tiempo de ejecución del algoritmo (o el espacio ocupado) y el crecimiento del tamaño de los datos.
Consolidación | El análisis de complejidad de algoritmos más completo

1. ¿Cuáles son las ventajas en comparación con el análisis de desempeño?

El análisis del grado de asistencia tiene las características de no depender del entorno de ejecución, bajo costo, alta eficiencia, fácil operación y fuerte orientación.

2. ¿Por qué se requiere el análisis de complejidad?

La complejidad describe la relación entre el tiempo de ejecución del algoritmo (o el espacio ocupado) y el crecimiento del tamaño de los datos.
Consolidación | El análisis de complejidad de algoritmos más completo

1. ¿Qué métodos pueden realizar análisis de complejidad?

Método: "notación Big O"

2. ¿Qué es la notación Big O?

El "tiempo de ejecución" del algoritmo es proporcional al "número de ejecuciones" de cada línea de código [T (n) = O (f (n))] = "donde T (n) representa el tiempo total de ejecución del algoritmo y f (n) representa cada El número total de líneas de ejecución de código yn a menudo indican el tamaño de los datos.

3. ¿Cuáles son las características de la notación Big O?

Dado que la complejidad del tiempo describe la tendencia de crecimiento del tiempo de ejecución del algoritmo y la escala de datos, el orden constante, el orden bajo y los coeficientes en realidad no tienen una influencia decisiva en esta tendencia de crecimiento, por lo que estos elementos se ignoran al realizar el análisis de complejidad del tiempo.

4. Reglas de análisis de complejidad

  • [Código único para ver la frecuencia]: observe la complejidad temporal del "código de bucle" en el fragmento de código.

  • [Varias piezas de código para ver la más grande]: si hay varios bucles for, observe la complejidad temporal del código con los "bucles más anidados".

  • [Producto de código anidado]: bucle, código recursivo, multiplica los códigos anidados internos y externos para reducir la complejidad del tiempo.

------------------ ❤ ------------------

complejidad del tiempo

1. ¿Qué es la complejidad?

El "tiempo de ejecución T (n)" de todos los códigos es proporcional al "número de ejecuciones n" de cada línea de código [T (n) = O (f (n))].

2. Tres métodos de análisis

■ Regla máxima

Ignore las constantes, los niveles bajos y los coeficientes en la fórmula, y simplemente tome el número máximo de ciclos, que es la línea de código con más ciclos.

Ejemplo


1// 求n个数字之和
2int xiaolu(int n) {
3   int sum = 0;
4   for (int i = 1; i <= n; ++i) {
5     sum = sum + i;
6   }
7   return sum;
8 }

análisis


La segunda línea es una línea de código, que es un nivel constante, que no tiene nada que ver con n y se puede ignorar. La cuarta y quinta líneas de código son nuestros objetos de análisis clave y están relacionadas con n. La complejidad del tiempo refleja la relación entre el tiempo de ejecución y la escala de datos n. Debe ejecutarse n veces para encontrar la suma de n datos. Entonces, la complejidad del tiempo es O (n).

■ Regla de adición

La complejidad total es igual a la complejidad del ciclo con el mayor número de ciclos.

Ejemplo


 1int xiaolu(int n) {
 2   int sum = 0;
 3   //循环一
 4   for (int i = 1; i <= 100; j++) {
 5     sum = sum + i;
 6   }
 7   //循环二
 8   for (int j = 1; j <= n; j++) {
 9      sum = sum + i;
10   }
11 }

análisis


Hay dos bucles arriba, un bucle 100 veces y el otro bucle n. Elegimos el bucle con el mayor número de bucles y está relacionado con el "tamaño de datos n". De lo anterior se puede ver que podemos seleccionar fácilmente el segundo ciclo, que está relacionado con el tamaño de los datos n, el número de ciclos es el más grande y la complejidad de tiempo del código con el mayor número de ciclos representa la complejidad de tiempo total, que es O (n);

■ Regla de multiplicación

Cuando encontramos bucles for anidados, ¿cómo calculamos la complejidad del tiempo? Ese es el producto de los ciclos internos y externos.

Ejemplo


1 for (int j = 1; j <= n; j++) {
2     for(int i = 1; i <= n; i++)
3     sum = sum + i;
4 }

análisis


El ciclo exterior es una vez, el ciclo interior es n veces, luego el ciclo exterior es n veces y el ciclo interior es n * n veces. Entonces, la complejidad del tiempo es O (n²).


Complejidad espacial


1. ¿Qué es la complejidad del espacio?

Representa la relación de crecimiento entre el "espacio de almacenamiento" y el "tamaño de los datos" del algoritmo.

Ejemplo


 1int xiaolu(int n) {
 2   int sum = 0;
 3   //循环一
 4   for (int i = 1; i <= 100; j++) {
 5     sum = sum + i;
 6   }
 7   //循环二
 8   for (int j = 1; j <= n; j++) {
 9      sum = sum + i;
10   }
11 }

análisis


En todos los códigos, podemos encontrar fácilmente el código relacionado con el espacio de almacenamiento La segunda línea aplica para un espacio de almacenamiento de nivel constante, por lo que la complejidad del espacio es O (1).

2. La complejidad espacial más común

O (1) 、 O (n) 、 O (n²)。

■ O (1)

El método de representación de complejidad en el tiempo del nivel constante, ya sea una línea de código o varias líneas, siempre que sea un nivel constante, está representado por O (1).

Ejemplo


1int i = 1;
2int j = 2;
3int sum = i + j;

análisis


Porque estas tres líneas de código, es decir, el código de nivel constante, no cambian con el cambio del tamaño de n datos. (Excepto por bucle y recursividad)

■ O (logn) | O (nlogn)

La "complejidad de tiempo logarítmica" es la complejidad de tiempo más difícil de analizar.

Ejemplo


1 i=1;
2 while (i <= n)  {
3   i = i * 3;
4 }

análisis


La complejidad de tiempo necesaria para este código es la cantidad de veces que se ha ejecutado. Consulte la figura siguiente para obtener un análisis específico.

Consolidación | El análisis de complejidad de algoritmos más completo

suplemento


Independientemente de si se basa en 2, 3 o 10, la complejidad temporal de todos los órdenes logarítmicos se puede registrar como O (logn), porque el logaritmo se puede convertir, consulte los libros de texto de la escuela secundaria.

* ■ O (m + n) | O (m n) **

Consulte las reglas de suma y multiplicación mencionadas anteriormente.

Consolidación | El análisis de complejidad de algoritmos más completo
Consolidación | El análisis de complejidad de algoritmos más completo
1. La mejor y peor complejidad temporal

La denominada mejor y peor complejidad temporal corresponde a la ejecución del código en el mejor y peor caso, respectivamente.

Ejemplo


1 //在一个 array 数组中查找一个数据 a 是否存在
2for (int i = 1; i < n; i++) {
3    if (array[i] == a) {
4       return i;
5    }
6 }

análisis:


1. El mejor caso es que el primero en el arreglo son los datos que queremos encontrar. El código anterior se puede ejecutar una vez. En este caso, la complejidad de tiempo es la mejor complejidad de tiempo, que es O (1).

2. El peor de los casos es que el último de la matriz son los datos que queremos encontrar, y necesitamos recorrer la matriz n veces, lo que corresponde a la peor complejidad de tiempo de O (n).

2. Complejidad de tiempo medio

La complejidad del tiempo promedio debe analizarse con el conocimiento de la teoría de la probabilidad, que es lo que llamamos el promedio ponderado en la teoría de la probabilidad, también llamado valor esperado.

análisis


Por ejemplo, en el ejemplo anterior, suponga que la probabilidad de los datos que estamos buscando en la matriz es 1/2; la probabilidad de aparecer en la matriz es n / 1. De acuerdo con la fórmula siguiente, la probabilidad de aparición se puede calcular como 1 / 2n.

Consolidación | El análisis de complejidad de algoritmos más completo

Luego consideramos cada situación para calcular la complejidad de tiempo promedio.

Consolidación | El análisis de complejidad de algoritmos más completo

3. Complejidad del tiempo amortizado

■ ¿Qué es la complejidad del tiempo amortizado?

Por ejemplo, la complejidad temporal de insertar datos cada n veces es O (1), y la complejidad temporal de insertar datos una vez es O (n). Promediamos la complejidad temporal de este tiempo an veces de insertar datos, y el tiempo La complejidad sigue siendo O (1).

■ Análisis de amortización

Por ejemplo, la complejidad temporal de insertar datos cada n veces es O (1), y la complejidad temporal de insertar datos una vez es O (n). Promediamos la complejidad temporal de este tiempo an veces de insertar datos, y el tiempo La complejidad sigue siendo O (1).

■ Escena aplicable

Generalmente aplicada a una determinada estructura de datos, la complejidad temporal de la operación continua es relativamente baja, pero la complejidad temporal de los casos individuales es particularmente alta, promediaremos lo particularmente alto esta vez a la operación más baja.

■ Comparación de rendimiento de varias complejidades

Consolidación | El análisis de complejidad de algoritmos más completo

Supongo que te gusta

Origin blog.51cto.com/15064450/2599783
Recomendado
Clasificación