Estructura de datos versión en lenguaje C de base cero Yan Weimin: complejidad del tiempo, complejidad del espacio

Una vez que el algoritmo se escribe en un programa ejecutable, requiere recursos de tiempo y recursos de espacio (memoria) para ejecutarse. Por lo tanto, la calidad de un algoritmo generalmente se mide desde dos dimensiones: tiempo y espacio , es decir, complejidad temporal y complejidad espacial.

La complejidad del tiempo mide principalmente qué tan rápido se ejecuta un algoritmo, mientras que la complejidad del espacio mide principalmente el espacio adicional requerido para ejecutar un algoritmo. En los primeros días del desarrollo de las computadoras, la capacidad de almacenamiento de las computadoras era muy pequeña, por lo que la complejidad del espacio era muy importante, sin embargo, con el rápido desarrollo de la industria informática, la capacidad de almacenamiento de las computadoras ha alcanzado un nivel muy alto. Por tanto, ya no necesitamos prestar especial atención a la complejidad espacial de un algoritmo.

1. Complejidad del tiempo

1.1 El concepto de complejidad del tiempo.

Definición de complejidad temporal: en informática, la complejidad temporal de un algoritmo es una función que describe cuantitativamente el tiempo de ejecución del algoritmo. El tiempo que lleva ejecutar un algoritmo no se puede calcular teóricamente, solo puedes saberlo si colocas tu programa en la máquina y lo ejecutas. ¿Pero necesitamos probar cada algoritmo en una computadora? Es posible probar todo en una computadora, pero esto es muy problemático, por lo que se introduce el método de análisis de complejidad del tiempo. El tiempo que tarda un algoritmo es proporcional al número de ejecuciones de sus declaraciones. El número de ejecuciones de operaciones básicas en el algoritmo es la complejidad temporal del algoritmo .

Es decir: encontrar la expresión matemática entre una determinada afirmación básica y el tamaño del problema N es la complejidad temporal del algoritmo.

Ejemplo: (cálculo de complejidad del tiempo de bucle anidado)

En la práctica, cuando calculamos la  complejidad del tiempo, en realidad no tenemos que calcular el número exacto de ejecuciones, sino solo el número aproximado de ejecuciones, por lo que aquí usamos la representación asintótica de Big O.

En la práctica, el caso general se refiere al peor caso de funcionamiento del algoritmo. Por lo tanto, la complejidad temporal de Func1 en la pregunta anterior es O(N^2)

1.2 Notación asintótica de Big O

Notación O grande: es una notación matemática utilizada para describir el comportamiento asintótico de una función.

Derive el método Big O:

1. Reemplace todas las constantes aditivas en el tiempo de ejecución con la constante 1.

2. En la función de número modificado de operaciones, solo se retiene el término de orden más alto .

3. Si el término de orden más alto existe y no es 1, elimine la constante multiplicada por este término y el resultado será el orden O grande.

Ejemplo 1: (Cálculo de complejidad del tiempo de doble ciclo)

  La complejidad del tiempo es O (N)

Ejemplo 2:

 La complejidad del tiempo es O(M+N)

Si la pregunta tiene una premisa:

1) M es mucho mayor que N -> O(M)

2) N es mucho mayor que M -> O(N)

3) M y N son aproximadamente del mismo tamaño -> Se puede usar O(M) u O(N)

Nota: En circunstancias normales, N se utiliza como número desconocido al calcular la complejidad del tiempo, pero también se pueden utilizar M, K, etc.

Ejemplo 3: (Cálculo de complejidad del tiempo de ciclo constante)

  La complejidad del tiempo es O (1) (Nota: esto no significa que el algoritmo se ejecute una vez, sino un número constante de veces)

Ejemplo 4: (complejidad del tiempo strchar)

Nota: strchr() se utiliza para buscar un carácter en una cadena y devolver la posición de la primera aparición del carácter en la cadena.

 

Cuando un algoritmo tiene diferente complejidad temporal con diferentes entradas, la complejidad temporal debe esperarse de manera pesimista. En el peor de los casos, la complejidad temporal de la pregunta anterior es O(N) .

Ejemplo 5: (Cálculo de la complejidad del tiempo de clasificación de burbujas)

 Exacto: F(N)=[N*(N-1)]/2

La complejidad del tiempo es O(N^2)

Ejemplo 6: (Cálculo de la complejidad del tiempo de búsqueda binaria)

En el peor de los casos: cada vez, se busca la mitad del rango de la búsqueda anterior y cada búsqueda se divide por dos.

Entonces N/2/2/2....=1 (1 significa que cuando finalmente se reduce a un solo valor restante, es ese valor o no se puede encontrar)

Entonces 2^X=N (X es el número de veces)

La complejidad del tiempo final es O (log2N)

Ejemplo 7: (Cálculo factorial de complejidad del tiempo)

 Nota: Algoritmo recursivo: número de recursiones * número de llamadas recursivas por vez

La complejidad del tiempo es O (N)

Ejemplo 8: (cálculo de la complejidad del tiempo de Fibonacci)

  

 ​​​

 Nota: X se refiere a las llamadas recursivas faltantes marcadas con un círculo en el diagrama.

 La complejidad del tiempo es O(2^N)

1.3 Complejidad espacial

La complejidad del espacio también es una expresión de función matemática, que es una medida de la cantidad de espacio de almacenamiento adicional que ocupa temporalmente un algoritmo durante la operación .

La complejidad del espacio no es cuántos bytes de espacio ocupa el programa, porque esto no es muy significativo, por lo que la complejidad del espacio se calcula como el número de variables. Las reglas de cálculo de la complejidad espacial son básicamente similares a las de la complejidad temporal y también utilizan notación asintótica O grande .

Nota: El espacio de pila requerido cuando la función se está ejecutando (almacenamiento de parámetros, variables locales, cierta información de registro, etc.) se determinó durante la compilación, por lo que la complejidad del espacio está determinada principalmente por el espacio adicional solicitado por la función durante el tiempo de ejecución .

Ejemplo 1:

 Los únicos requisitos adicionales son un final y una i (i se destruye al final del ciclo, y i se define nuevamente al ingresar nuevamente al ciclo. Esta i comparte espacio con la i anterior). Se puede entender que en cualquier periodo de tiempo o momento, solo hay un final i y An.

Complejidad espacial: O (1)

Ejemplo 2:

Complejidad espacial: O (N)

Complejidad del tiempo: O (N)

Ejemplo 3:

La llamada recursiva se realiza N veces, se abren N marcos de pila y cada marco de pila utiliza una cantidad constante de espacio.

Complejidad espacial: O (N)

Ejemplo 4:

Complejidad espacial: O (N)

Nota: El espacio se puede reutilizar y no se acumula, pero el tiempo se acumula una vez que se agota.

Las complejidades comunes de algunos algoritmos son las siguientes:

Ejercicio 1:

 

 Código de la idea 2: (escrito por mí solo como referencia)

#include<stdio.h>
void main()
{
	int num[5] = {0};
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		scanf("%d", &num[i]);
	}
	int sum = 0;
	int sum_num = 0;
	for (i = 0; i < 6; i++)
	{
		sum = sum + i;
	}
	for (i = 0; i < 5; i++)
	{
		sum_num = sum_num + num[i];
	}
	printf("缺%d.", sum - sum_num);
}

Idea 3 código principal

Ejercicio 2:

 

 

 

Código de la idea 3:

 

 

Supongo que te gusta

Origin blog.csdn.net/Chen298/article/details/132512299
Recomendado
Clasificación