[Clase 1 de algoritmos básicos cero] La complejidad temporal del algoritmo

En el campo de la informática, ya sea para ir a la universidad o para una entrevista, los algoritmos son un obstáculo que no se puede eludir. Algunas escuelas y empresas representan una gran parte de las puntuaciones en esta parte del algoritmo. Entonces, el aprendizaje de algoritmos es muy necesario.

Esto nos dice a través de un ejemplo para ilustrar qué es un algoritmo, cuál es la complejidad temporal del algoritmo y cómo analizar la complejidad temporal del algoritmo. ¿Es picante? Empecemos ↓↓↓

Mira un tema

Números obviamente aleatorios : obviamente, quiero pedirles a algunos estudiantes que hagan una encuesta por cuestionario en la escuela. Para la objetividad del experimento, primero generó el NN con una computadoraN números enteros aleatorios entre 1 y 1000 (N ≤ 100 N ≤ 100norte1 0 0 ), para el número repetido solo se conserva uno y se elimina el resto del mismo número, los números diferentes corresponden a las diferentes identificaciones de los estudiantes. Luego, ordena estos números de menor a mayor, y ve a los compañeros de clase para hacer la encuesta en el orden ordenado. Ayude a completar claramente el trabajo de "desduplicación" y "clasificación".

Para este problema, podemos usar la idea de la estadística: configure una matriz rec[n]y luego recorra todos los números de los estudiantes de adelante hacia atrás, y ordene cada vez que ise encuentre un número de estudiante rec[i] = 1. Finalmente, recorra la matriz nuevamente rec, siempre que el valor sea 1, es la identificación del estudiante que ha aparecido. [Algoritmo①]

Este tipo de pensamiento estadístico es muy común en la clasificación. Los lectores interesados ​​pueden buscar "clasificación de cubos" o "clasificación de base".

Que es un algoritmo

La forma de solucionar el problema con la computadora . Es una descripción precisa y completa de la resolución de un problema.

Nuestra descripción anterior del problema [algoritmo①] es un algoritmo (pero no está expresado en un lenguaje específico)

Complejidad del tiempo: uno de los principales indicadores para medir la calidad de un algoritmo

La complejidad del tiempo mide cuánto tiempo usa un algoritmo. Cuanto menor sea la complejidad temporal de un algoritmo, menor será el tiempo que tarda en ejecutarse una vez y mejor será el algoritmo. Así que tenemos que optimizar la complejidad del tiempo de nuestro algoritmo tanto como sea posible con la premisa de resolver el problema. Es decir: un mismo problema puede tener diferentes algoritmos, pueden consumir diferente tiempo, debemos tomar el que tenga el menor tiempo

Por qué la complejidad del tiempo es importante

Porque la complejidad del tiempo de un algoritmo representa cuánto tiempo necesitamos esperar a que termine el algoritmo antes de que podamos encontrar la solución al problema.

En una pieza de software, un determinado algoritmo probablemente sea solo una pequeña parte de todo el sistema. Si esta parte se usa durante demasiado tiempo, puede causar problemas como una velocidad de respuesta lenta de todo el software y una mala experiencia del usuario.

Al analizar datos, necesitamos ejecutar una gran cantidad de datos. En este momento, un algoritmo excelente puede ahorrar mucho tiempo. Y un algoritmo con una complejidad de tiempo demasiado alta puede llevar días, semanas o incluso años (por supuesto, también tiene algo que ver con el hardware).

Por lo tanto, existen ciertas restricciones sobre la complejidad temporal del algoritmo en varias preguntas de la entrevista.

Cómo analizar la complejidad temporal de un algoritmo

Para la pregunta que acabamos de hacer Kang Kang ( obviamente, un número aleatorio ), supongamos que tenemos un número de estudiante al azar fuera de nuestras manos 1 5 7 1 6 1 4 5 7. Tenemos que hacer dos cosas: deduplicar y clasificar. Si comenzamos con el primer número 1, buscamos hacia atrás 1y eliminamos si los encontramos. Luego 5busque hacia atrás desde el segundo número 5y elimine cuando lo encuentre. (Para ahorrar tiempo, use una del[n]matriz con un valor inicial de 0, y los elementos eliminados ise registran en la matriz del[i] = 1) . Después de hacer esto, la clasificación también puede resolver este problema. Pero el tiempo es mucho más lento que el método utilizado en el artículo anterior. [Algoritmo ②: Desduplicar primero y luego ordenar]

Algoritmo ②Time análisis de complejidad :
de-duplicación : Para cada número, todos los números subsiguientes debe ser atravesada, y en promedio, las necesidades de cada número a ser atravesada n 2 \ frac {n} {2}2nEs nnecesario recorrer el número total . Multiplica los dos para obtener la complejidad de tiempo de este algoritmo, expresada como: O (1 2 n 2) = O (n 2) O (\ frac {1} {2} n ^ 2) = O (n ^ 2)O (21norte2 )=O ( n2 )(Porque cuando n es lo suficientemente grande, la influencia de la constante se puede ignorar, por lo que la complejidad del tiempo generalmente omite la constante anterior)

Clasificación : la complejidad de tiempo mínima es nlog 2 n nlog_2nn l o g2n
(La implementación específica está limitada por la extensión de este artículo. Si está interesado, puede consultar "Clasificación rápida". Muchos lenguajes también tienen funciones de clasificación directa que se pueden utilizar. La complejidad de tiempo es óptimanlogn nlognn l o g n )inicie sesiónaquíl o g n se refiere al nivel logarítmico de complejidad de tiempo, y la base es 2 por defecto, que a menudo se omite.

Aquí, la deduplicación y la clasificación son operaciones paralelas (que no se afectan entre sí). Tomamos la operación más grande como la complejidad temporal de todo el algoritmo. La complejidad temporal del método ② es O (n 2) O (n ^ 2)O ( n2 )

Por supuesto, también podemos ordenar los números primero y luego desduplicarlos: 1 5 7 1 6 1 4 5 7después de ordenar los números disponibles, obtenemos :, 1 1 1 4 5 5 6 7 7y luego comenzando desde el segundo número, para cada número, ver si el número anterior es igual a él. , si es igual Luego bórralo (también si quieres ahorrar tiempo, puedes usar una del[n]matriz para registrar los elementos eliminados) [Algoritmo ③: primero ordena y luego elimina los duplicados]

Algoritmo ③ Análisis de complejidad temporal :

Ordenar : Igual que el anterior, la complejidad de tiempo mínima es nlog 2 n nlog_2nn l o g2norte

Y la deduplicación de este paso de clasificación sobre la base de solo el barrido de línea sobre toda la matriz, es O (n) O (n)O ( n ) nivel de complejidad temporal. PorqueO (n) < O (nlogn) O (n) < O (nlogn)O ( n ) O ( n l o g n ) , cuando los dos están unidos, tomamos el mayor como su complejidad de tiempo. La complejidad temporal del método ③ esO (nlog 2 n) O (nlog_2n)O ( n l o g2n )

Algoritmo ① análisis de complejidad temporal : el algoritmo ① solo necesita recorrer toda la matriz una vez, por lo que la complejidad temporal del algoritmo ① es O (n) O (n)O ( n ) (Si incluye la ID del estudiante de salida, repita dos veces, pero la constante se ignora, por lo que sigue siendo una complejidad de tiempo lineal)

Comparación de la complejidad del tiempo común

O (1) <O (log) <O (n) <O (n) <O (nlogn) <O (n 2) <O (n 3) <O (C n) <O (n!) <O (nn) O (1) <O (inicio de sesión) <O (\ sqrt {n}) <O (n) <O (nlogn) <O (n ^ 2) <O (n ^ 3) <O (C ^ n) <O (n!) <O (n ^ n) O ( 1 )<O ( l o g n )<O (norte )<O ( n )<O ( n l o g n )<O ( n2 )<O ( n3 )<O ( Cn )<Oh ( n ! )<O ( nn )aquíCCC es una constante,nnn es el tamaño de entrada del algoritmo

Su nombre, solo entiéndalo: lo haremos O (1) O (1)O ( 1 ) se llama nivel constante,O (logn) O (logn)O ( l o g n ) se llama orden logarítmico,O (n) O (n)O ( n ) se llama nivel lineal,O (C n) O (C ^ n)O ( Cn ) sellama exponencial,O (n!) O (n!)O ( n ! ) Nivel factorial. Generalmente, los algoritmos anteriores al nivel lineal son excelentes algoritmos. Después de alcanzar el nivel exponencial, está muy mal.

Sitio web de uso frecuente

Los ejemplos de preguntas de esta serie tienen sitios web de evaluación correspondientes, y la URL se adjuntará a cada pregunta. Después de leer el blog, los lectores pueden vincularse al sitio web correspondiente para enviar su propia consolidación de código. El sitio web se basa principalmente en ganado , y tanto Luogu como codeforces están involucrados.

Supongo que te gusta

Origin blog.csdn.net/weixin_44559752/article/details/108218611
Recomendado
Clasificación