Estructura de datos: comprensión preliminar de los algoritmos.

Un algoritmo es una descripción de los pasos para resolver un problema específico, representado en una computadora como una secuencia finita de instrucciones, y cada instrucción representa una o más operaciones.

¿Qué es el algoritmo?

Se le pide que escriba un programa que obtenga el resultado de 1+2+3+…+100. ¿Cómo debería escribirlo? La mayoría de la
gente escribirá inmediatamente el siguiente código en lenguaje C (o código en otros lenguajes):

int a, sum- o, n= 100;
for (1 = 1; 1 <= n; i++) {
    
    
	sum = sumt + i;
}
printf("%d", sum);

La respuesta que da Gauss, un gran matemático que nació en un pequeño pueblo alemán en el siglo XVIII, es:

El programa se implementa de la siguiente manera:
int i, sum = O, n = 100; 
 sum = (1 + n ) * n / 2;
 printf("%d", sum);

Para comprender cierto o cierto tipo de problema, las instrucciones deben representarse como una determinada secuencia de operaciones. La secuencia de operaciones incluye un conjunto de operaciones, y cada operación completa una función específica. Este es el algoritmo. (Los algoritmos en realidad describen métodos para resolver problemas).

También hemos visto en el ejemplo anterior que para un problema determinado, puede haber varios algoritmos para resolverlo rápidamente.
¿Existe un algoritmo general? ¿Existe algún medicamento que pueda curar todas las enfermedades? Los problemas en el mundo real son muy extraños y, por supuesto, los algoritmos cambian constantemente. No existe un algoritmo universal que pueda resolver todos los problemas. Incluso para resolver un problema pequeño, un algoritmo muy bueno puede no ser adecuado.

Características de los algoritmos.

Los algoritmos tienen cinco características básicas: entrada, salida, finitud, certeza y viabilidad.

  • El algoritmo de entrada
    tiene cero o más entradas . La mayoría de los parámetros de entrada del algoritmo son necesarios, pero en algunos casos, como la impresión de hello world!código como este, no se requieren parámetros de entrada.
  • Un algoritmo de salida
    tiene al menos una o más salidas . El algoritmo debe generar resultados, pero no es necesario generarlos. ¿Por qué utiliza este algoritmo? La salida puede ser en forma de impresión o devolución de uno o más valores.
  • La finitud
    significa que el algoritmo finaliza automáticamente después de ejecutar un número limitado de pasos sin bucles infinitos, y cada paso se completa en un tiempo aceptable . Si escribe un algoritmo, la computadora tardará veinte años en completarlo. Es finito en un sentido matemático, pero como la nuera se ha convertido en suegra, la importancia del algoritmo no será excelente.
  • Cada paso de un algoritmo determinista
    tiene un significado definido y no hay ambigüedad . La misma entrada solo puede tener resultados de salida únicos.
  • Cada paso del algoritmo de viabilidad
    debe ser factible y puede completarse ejecutándolo un número limitado de veces . Viabilidad significa que el algoritmo se puede convertir en un programa y ejecutar en una computadora durante mucho tiempo y obtener los resultados correctos.

Requisitos de diseño de algoritmos

Los algoritmos no son únicos, puede haber varios algoritmos para resolver el mismo problema. Aunque el algoritmo no es único, todavía existen algoritmos relativamente buenos.

  • Corrección
    La corrección de un algoritmo significa que el algoritmo debe al menos tener entradas, salidas y procesamiento inequívocos, puede reflejar correctamente las necesidades del problema y puede obtener la respuesta correcta al problema.
  • Legibilidad
    Otro propósito del diseño de algoritmos es facilitar la lectura, la comprensión y la comunicación.
  • Robustez
    : cuando los datos de entrada son ilegales, el algoritmo también puede manejarlos sin producir resultados anormales o inexplicables.
  • Alta eficiencia en el tiempo y baja capacidad de almacenamiento
    El algoritmo de diseño debe intentar cumplir con los requisitos de alta eficiencia en el tiempo y baja capacidad de almacenamiento. La gente quiere gastar la menor cantidad de dinero y hacer lo mejor en el menor tiempo. Los algoritmos tienen la misma idea: es mejor usar el menor espacio de almacenamiento y dedicar el menor tiempo posible para lograr lo mismo, lo cual es un buen algoritmo.

En resumen, un buen algoritmo debe tener las características de corrección, legibilidad, robustez, alta eficiencia y baja capacidad de almacenamiento.

Complejidad del tiempo del algoritmo

Al analizar el algoritmo, el número total de ejecuciones de declaraciones T(n)es nfunción del tamaño del problema, y ​​luego se analiza el cambio de y se determina T(n)el orden de magnitud de. La complejidad temporal del algoritmo, es decir, la medida del tiempo del algoritmo, se escribe como: . Significa que a medida que aumenta el tamaño del problema, la tasa de crecimiento del tiempo de ejecución del algoritmo es la misma que la tasa de crecimiento de, lo que se denomina complejidad temporal asintótica del algoritmo, denominada complejidad temporal. ¿Dónde hay alguna función del tamaño del problema ? Esta notación que utiliza O() mayúscula para reflejar la complejidad temporal del algoritmo se llama notación O grande .nT(n)
T(n) = O(f(n))nf(n)f(n)n

Derive el orden O grande :
  • Reemplace todas las constantes aditivas en tiempo de ejecución con la constante 1.
  • En la función de número modificado de ejecuciones, solo se retienen los términos de orden más alto.
  • Si el término de mayor orden existe y no es 1, elimine la constante multiplicada por este término.

Complejidad del tiempo común

Función de tiempos de ejecución nivel término informal
12 O(1) orden constante
2n+3 O( nnnorte ) orden lineal
3 norte 2 norte ^ {2}norte2 +2n+3 O( nnnorte ) orden cuadrado
5 registro 2 registro_ {2}iniciar sesión _2n+20 O(log nnnorte ) Orden logarítmico
2norte+3norte registro 2 registro_{2}iniciar sesión _2n+19 O( nnn iniciar sesiónnnnorte ) orden nlogn
6 norte 3 norte ^ {3}norte3 +2norte 2 norte^{2}norte2 +3n+4 O ( norte 3 norte^{3}norte3 ) orden cúbico
2 norte 2 ^ {n}2norte O( 2 norte 2^{n}2norte ) Orden exponencial

La complejidad del tiempo comúnmente utilizada, de pequeña a grande, es:
O(1)<O(log nnn )<O(nnn )<O(nnn iniciar sesiónnnnorte )<O(norte 2 norte^{2}norte2 )<O(norte 3 norte^{3}norte3 )<O(2 norte 2^{n}2n )<O(nnn !)<O(nnn^{n}nortenorte )

Una forma de analizar un algoritmo es calcular el promedio de todas las situaciones. Este método de calcular la complejidad del tiempo se denomina complejidad del tiempo promedio. Otro enfoque consiste en calcular la complejidad temporal del peor de los casos, lo que se denomina complejidad temporal del peor de los casos. Generalmente, a menos que se especifique lo contrario, se refiere a la peor complejidad temporal.

Complejidad del espacio del algoritmo

Cuando escribimos código, podemos intercambiar espacio por tiempo. Por ejemplo, para determinar si un determinado año es bisiesto, puede dedicar algún tiempo a escribir un algoritmo y, dado que es un algoritmo, significa que cada vez Dado un año , es necesario calcular si es año bisiesto. Otra forma es crear una matriz con 2050 elementos por adelantado (el número de años es un poco mayor que la realidad) y luego hacer corresponder todos los años con los números subíndices. Si es un año bisiesto, el valor de este elemento de la matriz es 1 , si no, el valor es 0. De esta manera, el llamado juicio sobre si un determinado año es bisiesto se convierte en el problema de encontrar el valor de un determinado elemento en esta matriz. En este momento, nuestra operación está minimizada, pero estos 2050 0 y 1 deben almacenarse en el disco duro o en la memoria. Este es un pequeño truco que intercambia espacio adicional por tiempo de cálculo.

La complejidad espacial del algoritmo se logra calculando el espacio de almacenamiento requerido por el algoritmo. La fórmula de cálculo de la complejidad espacial del algoritmo se registra como: S (n) = O (f (n)), donde n es la escala del problema, f(n) es una función del espacio de almacenamiento ocupado por el enunciado sobre n.

Si el espacio auxiliar requerido para la ejecución del algoritmo es constante en relación con la cantidad de datos de entrada, se dice que el algoritmo funciona en su lugar y la complejidad del espacio es 0 (1).

Supongo que te gusta

Origin blog.csdn.net/wujakf/article/details/127885423
Recomendado
Clasificación