【Examen de ingreso de posgrado o estructura de datos de autoaprendizaje 1.2】 —— Algoritmo (concepto básico de algoritmo, medición de la eficiencia del algoritmo [complejidad del tiempo, complejidad del espacio])

Nota: Estudie en combinación con libros específicos; recomiende "Estructura de datos y algoritmo", "Estructura de datos de Wang Dao", "Estructura de datos de Tianqin", etc.

Notas sin conexión: https://download.csdn.net/download/qq_38454176/12352560

1. El concepto básico del algoritmo

Descripción general de la estructura del conocimiento
Inserte la descripción de la imagen aquí

1.1 Qué es un algoritmo

Programa = estructura de datos + algoritmo
Estructura de datos: cómo informar problemas del mundo real y almacenar la información en la computadora. Al mismo tiempo, se deben implementar operaciones básicas sobre la estructura de datos.

Algoritmo: cómo procesar esta información para resolver problemas prácticos

Ejemplo: Análisis de problemas de alimentación prioritarios para clientes con niños:
Inserte la descripción de la imagen aquí

1.2 5 características del algoritmo

Las características del algoritmo: 必须具备las características del algoritmo

  1. 有穷性: Un algoritmo siempre debe finalizar después de ejecutar pasos finitos, y cada paso se puede completar en un tiempo finito.
    Nota: El algoritmo debe ser infinito (usar pasos finitos para resolver un problema específico) y el programa puede ser infinito (el sistema de colas es un programa que nunca puede detenerse)

  2. 确定性: Cada instrucción del algoritmo debe tener un significado exacto, que 相同的输入solo se puede obtener 相同的输出.

  3. 可行性: Las operaciones descritas en el algoritmo pueden implementarse todas ya 基本运算执行有限次implementadas.

  4. 输入: Un algoritmo tiene 零个或多个输入(como hola mundo no es una entrada), estas entradas se toman de una colección de objetos específicos.

  5. 输出: Un algoritmo tiene 一个或多个输出, estas salidas son cantidades que tienen una cierta relación específica con la entrada.

1.3 Las características de un "buen" algoritmo

Objetivos a perseguir al diseñar algoritmos

  1. 正确性: El algoritmo debería poder resolver el problema correctamente.

  2. 可读性: El algoritmo debe tener una buena legibilidad para ayudar a las personas a comprender.
    Nota: El algoritmo se puede describir en pseudocódigo o incluso en texto. Es importante describir los pasos para resolver el problema "sin ambigüedades"

  3. 健壮性: Al ingresar datos ilegales, el algoritmo puede reaccionar o procesar adecuadamente sin producir resultados de salida inexplicables.

  4. 高效率Con 低存储量需求: Velocidad de ejecución rápida. La complejidad del tiempo es baja; no se requiere memoria. Complejidad espacial baja

2. Medición de la eficiencia del algoritmo

2.1 Complejidad del tiempo

Descripción general de la estructura
Inserte la descripción de la imagen aquíNota: Los problemas de rendimiento del algoritmo solo se expondrán cuando n es grande

2.1.1 Cómo evaluar el costo de tiempo del algoritmo

  1. ¿Dejar que el algoritmo se ejecute primero y contar el tiempo de ejecución después?
    ¿Cuál es el problema?
  • Relacionado con el rendimiento de la máquina, como: supercomputadora frente a microcomputadora de un solo chip
  • En relación con el lenguaje de programación, cuanto mayor sea el nivel del lenguaje, menor será la eficiencia de ejecución.
  • Relacionado con la calidad de las instrucciones de la máquina generadas por el compilador
  • Algunos algoritmos no se pueden contar a posteriori, como: algoritmo de control de misiles

2.1.2 La complejidad temporal del algoritmo

La complejidad del tiempo del algoritmo: predice la relación entre el costo de tiempo del algoritmo T (n) y el tamaño del problema n por adelantado (T significa "tiempo")

Ejemplo: use un algoritmo para confesar:
Inserte la descripción de la imagen aquídos preguntas sobre amarte N veces en el Complejo 4 se discutirán y analizarán a continuación

2.1.3 Pregunta 1: ¿Se pueden omitir algunas partes de la expresión?

Análisis y conclusión:
Inserte la descripción de la imagen aquí

  • Conclusión 1: solo puede considerar la parte de orden superior
  • Conclusión 2: cuando la escala del problema es lo suficientemente grande, el coeficiente del término constante también puede ignorarse

2.1.4 Las reglas de operación de la complejidad temporal del algoritmo

  1. 加法规则T (n) = T1 (n ) + T2 (n) = O (f (n)) + O (g (n)) = O (max (f (n), g (n)))
    número de la suma , Solo se retiene el término de orden más alto y el coeficiente se convierte en 1

  2. 乘法规则T (n) = T1 (n) × T2 (n) = O (f (n)) × O (g (n)) = O (f (n) × g (n))
    Por ejemplo: T3 (n) = n^3 +n^2 log2n =O(n^3)+O(n^2 log2n) =???
    Multiplica varios elementos y guárdalos

La complejidad temporal se
Inserte la descripción de la imagen aquíenumera de la siguiente manera: La complejidad temporal de los dos algoritmos es la siguiente, ¿cuál es de orden superior (mayor complejidad temporal)?
Inserte la descripción de la imagen aquí

2.1.5 Pregunta 2: Si hay miles de líneas de código, ¿necesita una línea por línea de acuerdo con este método?

Análisis y conclusión:

Inserte la descripción de la imagen aquí

2.1.6 Análisis y conclusiones de varios algoritmos diferentes

  1. Tipo de bucle anidado:
    Inserte la descripción de la imagen aquí
  2. Incrementando exponencialmente
void loveYou(int n) {
    
     //n 为问题规模
       int i = 1;  // 爱你程度
       while (i <= n) {
    
       //外层循环执行n次
              i*2;  // 每次翻倍
             printf("I Love You %d", i);
              }
        printf("I Love You More Than %d", n);
   }

Calcule la complejidad de tiempo T (n) del algoritmo anterior: suponga que la frecuencia de la oración del bucle más profundo (el número total de bucles) es x, entonces se puede saber a partir de la condición del bucle que 2 ^ x> n
x = log2n + 1 se cumple al final del ciclo
T (n) = O (x) = O (log2n)

  1. Buscar por numero
void loveYou(int flag[], int n) {
    
     //n 为问题规模
		 printf("I anm Iron Man %d");
       int i = 1;  // 爱你程度
       for(int i=0;i<n;i++{
    
     //从第一个元素开始查找
       		if(flag[i] == n) {
    
     //找到元素n
       			printf("I Love You %d", n);
       			break; //找到后立即跳出循环
       		}
       	}
   }


int flag[n] = {
    
    1...n};

Calcule la complejidad de tiempo del algoritmo anterior T (n)
最好Caso: El elemento n está en la primera posición- 最好时间复杂度T (n) = O (1)
最坏Caso: El elemento n está en la última posición- 最坏时间复杂度T (n) = O (n)
平均Situación: suponga que la probabilidad del elemento n en cualquier posición es la misma que 1 / n —— 平均时间复杂度T (n) = O (n)

2.1.7 Mejor, peor, complejidad de tiempo promedio

Peor complejidad temporal: la complejidad temporal del algoritmo en el peor de los casos
Complejidad temporal media: el tiempo de ejecución esperado del algoritmo cuando todos los ejemplos de entrada aparecen con la misma probabilidad.
Mejor complejidad temporal: la complejidad temporal del algoritmo en el mejor de los casos

2.2 Complejidad espacial

Marco de conocimiento:
Inserte la descripción de la imagen aquí

2.2.1 Requisitos de memoria (complejidad del espacio) cuando el programa se está ejecutando

Análisis de caso 1:
Inserte la descripción de la imagen aquí
Análisis de caso 2:
Inserte la descripción de la imagen aquí
Análisis de caso 3:
Inserte la descripción de la imagen aquí

2.2.2 Sobrecarga de memoria causada por llamadas de función recursivas

Estudio de caso 1:
Inserte la descripción de la imagen aquí
Estudio de caso 2:

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/qq_38454176/article/details/105679307
Recomendado
Clasificación