1.2 Algoritmos y evaluación de algoritmos (complejidad temporal y complejidad espacial)

1. Conceptos básicos de algoritmos

Un algoritmo es una descripción de los pasos para resolver un problema particular, que es una secuencia finita de instrucciones, cada una de las cuales representa una o más operaciones.

Características del algoritmo:

1. Finitud: un algoritmo siempre debe terminar después de ejecutar pasos finitos, y cada paso puede completarse en un tiempo finito.
2. Determinista: cada instrucción en el algoritmo debe tener un significado definido y solo se puede obtener la misma salida para la misma entrada.
3. Viabilidad: todas las operaciones descritas en el algoritmo se pueden implementar realizando un número limitado de operaciones básicas que se han implementado.
4. Entradas: un algoritmo tiene cero o más entradas, que se toman de un conjunto específico de objetos.
5. Salida: un algoritmo tiene una o más salidas, que son cantidades que tienen cierta relación con la entrada.

Lo que logra un buen algoritmo:

Corrección: El algoritmo debe ser capaz de resolver correctamente el problema.
Legibilidad: los algoritmos deben ser legibles para ayudar a las personas a comprender.
Robustez: cuando se ingresan datos ilegales, el algoritmo puede reaccionar o procesar adecuadamente sin producir resultados de salida inexplicables.
Eficiencia y bajos requisitos de almacenamiento: la eficiencia se refiere al tiempo que tarda en ejecutarse el algoritmo y los requisitos de almacenamiento se refieren al espacio de almacenamiento máximo requerido durante la ejecución del algoritmo, ambos relacionados con el tamaño del problema.

2. Medidas de Eficiencia Algorítmica

La eficiencia del algoritmo se describe por la complejidad del tiempo y la complejidad del espacio.

2.1 Complejidad temporal del algoritmo

¿La complejidad del tiempo compara el tiempo de ejecución de los programas?

No, debido a que las diferencias en el hardware pueden generar diferencias de tiempo, un mal programa podría ejecutarse en menos tiempo en una computadora actual que un buen programa en una computadora de hace diez años, por lo que no es muy atemporal sin una comparación. Si es preciso, entonces es mucho más justo para nosotros comparar por el número de veces que se ejecuta la declaración.

En general, el número de repeticiones de las operaciones básicas en el algoritmo es una función f(n) del tamaño del problema n, y la medida del tiempo del algoritmo se denota como T(n)=O(f(n)), lo que significa que con el tamaño del problema n La tasa de crecimiento del tiempo de ejecución del algoritmo es la misma que la tasa de crecimiento de f(n), lo que se denomina complejidad de tiempo asintótica del algoritmo, o complejidad de tiempo para abreviar.

Por ejemplo: el parámetro de entrada es n, el número de sentencias es f(n), la complejidad es O(f(n)) y la función O() es una función que elimina los coeficientes de términos de orden alto y bajo. -condiciones de pedido

int count=0;

La complejidad del tiempo es O(0)

int n=8, count=0;

for (int i=1; i<=n; i++){
    
    
    count++;
}

La complejidad del tiempo es O(n)

2.2 La complejidad espacial del algoritmo

¿La complejidad del espacio considera el tamaño del programa (archivo ejecutable)?

La complejidad del espacio es considerar el tamaño de la memoria ocupada por el programa cuando se está ejecutando, no el tamaño del archivo ejecutable. Sin embargo, no es exacto calcular la memoria ocupada por el programa cuando se está ejecutando. Muchos factores afectarán el uso real de la memoria del programa, como la alineación de la memoria del compilador, la implementación subyacente del contenedor del lenguaje de programación, etc. ., lo que afectará la sobrecarga de la memoria del programa. Entonces, la complejidad del espacio es estimar aproximadamente el tamaño del uso de la memoria del programa por adelantado.

La complejidad espacial S(n) de un algoritmo se define como el espacio de almacenamiento consumido por el algoritmo, que es una función del tamaño del problema n. Indicarlo como S(n)=O(g(n)).

int j = 0;
for (int i = 0; i < n; i++) {
    
    
    j++;
}

En el primer fragmento de código podemos ver que con el cambio de n, el espacio de memoria a abrir no cambia con el cambio de n,
es decir, la complejidad espacial de este algoritmo es una constante, por lo que se expresa como gran O(1)

int* a = new int(n);
for (int i = 0; i < n; i++) {
    
    
    a[i] = i;
} 

Hemos creado una nueva matriz. El tamaño de estos datos es n.
Aunque hay un bucle for, no se asigna ningún espacio nuevo. Por lo tanto, la complejidad del espacio de este código depende principalmente de la primera línea, que puede
aumentar con n. , el tamaño de la memoria abierta crece linealmente, es decir, O(n)

Supongo que te gusta

Origin blog.csdn.net/m0_50991874/article/details/123292693
Recomendado
Clasificación