¿Cómo pensamos de forma informática?

Desde el primer día de la universidad, el profesor nos ha enseñado sobre varios algoritmos. Desde varios algoritmos de búsqueda y clasificación hasta algoritmos recursivos y codiciosos, he estado luchando con estos algoritmos en mi primer año. Hasta después del trabajo, para hacer frente a la entrevista, todavía tengo que volver a roer libros de algoritmos o cepillar algunos ejercicios de algoritmos, para poder recuperar algunos recuerdos de la escuela. ¿Por qué los algoritmos son tan difíciles de recordar? En otras palabras, ¿por qué los algoritmos informáticos no pueden ser más intuitivos?

Debido a que los algoritmos informáticos son antihumanos, en esencia, esto se debe a la diferencia entre la forma de pensar de la computadora y la forma de pensar del cerebro humano.

No existe una teoría definida sobre el mecanismo del pensamiento del cerebro humano, se cree temporalmente que es el efecto de sustancias químicas y señales eléctricas. Aunque no existe una explicación científica, cada uno de nosotros tiene un cerebro y cada uno de nosotros puede sentir su propia forma de pensar.

La computadora es creada por humanos. Desde el comienzo de su diseño, no está diseñada para simular el cerebro humano. Por lo tanto, tiene su propio método de trabajo único. Solo entendiendo el método de trabajo de una computadora se puede aprender a pensar en su Puede escribir el código de programa más adecuado para el funcionamiento de la computadora.

Encuentre un número específico en una matriz ordenada: cerebro humano vs computadora, ronda 1

Usamos un ejemplo específico para ilustrar que el cerebro humano y la computadora tienen diferentes formas de pensar. Supongamos que queremos encontrar un número específico de una matriz que ha sido ordenada.

Sabiendo que la matriz ordenada es 1 2 3 5 7 13 34 67 90 127 308, queremos averiguar si el número 13 está en la matriz.

¿Cómo realiza las tareas el cerebro humano?

El cerebro humano está casi "haciendo trampa" para lidiar con estos problemas. Podemos ver diez líneas de un vistazo. Podemos encontrar 13 cuando miramos las gafas, así que si me pregunto cómo encontré 13, solo puedo decir que "ver" Arriba.

¿Y cómo realiza la computadora esta tarea?

El algoritmo más simple y tonto es leer el arreglo uno por uno comenzando desde el arreglo.Creo que cada estudiante que ha aprendido los conceptos básicos de programación puede escribir código similar al siguiente.

boolean isNumInArray(int num, int[] array) {
	for (int i = 0; i < array.length; i++) {
	    if (array[i] == num) {
	    	return true;
	    }
	}
	return false;
}

La computadora debe comenzar con el primer elemento de la matriz y verificar los elementos de la matriz actual uno por uno, y compararlos con 13 para ver si son iguales. Para encontrar el número 13, la computadora tiene que realizar 6 ciclos y la gente ve la respuesta casi al instante.

¿Por qué las computadoras son tan "estúpidas" para resolver problemas? Tenemos que empezar por cómo funcionan las computadoras.

Como funciona la CPU

Como componente central de una computadora, la CPU también es el principal portador del algoritmo.

La CPU no piensa como una persona, solo entiende algunas instrucciones básicas. Cada CPU tiene su conjunto de instrucciones, que es un programa duro que se almacena dentro de la CPU y guía y optimiza las operaciones de la CPU. En términos sencillos, el conjunto de instrucciones es la forma de pensar de la CPU. Por ejemplo, habrá una instrucción ADD en un conjunto de instrucciones común. Esta instrucción puede sumar los valores en dos registros y almacenarlos en otro registro. Correspondiente a esto, también habrá una instrucción SUB, que se usa para agregar dos valores de registro Restar. Si consulta los manuales de varios conjuntos de instrucciones de la CPU, encontrará que básicamente contienen instrucciones básicas de suma, resta, multiplicación y división, así como instrucciones para almacenar y obtener datos de la memoria. El conjunto de instrucciones de CPU común es de unos pocos cientos de instrucciones como máximo. En otras palabras, la CPU solo tendrá estos cientos de comandos.

En comparación con la CPU, el cerebro humano tiene una memoria poderosa y capacidades de asociación. Por ejemplo, cuando ves 1 + 1, piensas en 2. Cuando ves una luz roja, piensas en detenerte, y cuando ves la puerta, saber abrir la manija de la puerta, es algo que se puede reflexionar inmediatamente sin pensar.

Por lo tanto, la CPU sabe muchas menos cosas (instrucciones) que los humanos ¿No es la CPU muy tonta? Sí, la CPU es muy estúpida, pero las ventajas de la CPU tampoco son igualadas por el cerebro humano:

  1. Aunque la CPU solo puede hacer cosas simples (cientos de instrucciones), puede garantizar cálculos correctos y resultados correctos dentro de un tiempo fijo (tiempo de ejecución de instrucciones). El cerebro humano no puede garantizar que se produzca el "mismo" resultado de pensamiento en un tiempo fijo.
  2. La tecnología de CPU moderna puede ejecutar más de un millón de instrucciones en un segundo, pero la velocidad de pensamiento del cerebro humano no es tan rápida como lo es. Nuestro "pensamiento" requiere un tiempo de reacción de unas pocas décimas de segundo.

En resumen, la CPU es un tipo tonto y rápido.

Almacenamiento de computadora

El almacenamiento común de computadoras incluye registros, caché, memoria, disco duro, etc.

Los registros son equivalentes a cosas que se pueden recordar inmediatamente en el cerebro humano Todas las operaciones realizadas por la CPU se realizan sobre los datos de los registros. El registro almacena información como qué cálculo va a realizar actualmente la computadora (registro de instrucciones), los datos a calcular (registro de datos) y qué paso se ha calculado (registro de segmento). Ya sea la CPU de registro más antiguo o la CPU más reciente y fuerte, el número de sus registros es solo unas pocas docenas como máximo (en casos especiales hay cientos), lo que significa que la información que la CPU puede usar inmediatamente al mismo tiempo es esto. Docenas de números.

La memoria es la principal función de almacenamiento de la computadora. Puede almacenar la información del programa en ejecución. La memoria es equivalente a la estantería de la biblioteca. La CPU necesita usar una determinada pieza de datos en la memoria. Necesita pasar la instrucción LOAD y adjuntar un número de estantería (dirección de memoria), y luego el controlador de memoria puede transmitir los datos de la dirección correspondiente a la CPU a través del bus, y la CPU pondrá el resultado cargado en el registro para su uso. La velocidad de acceso a la memoria es mucho menor que la de los registros, pero la velocidad de acceso a los datos distribuidos en varias secciones de la memoria es básicamente la misma.

Dado que la mayoría de las veces la CPU necesita leer un segmento continuo de memoria para realizar operaciones, la CPU generalmente tiene una caché de alta velocidad para almacenar en caché toda la memoria utilizada recientemente, de modo que la CPU no necesita leer la memoria cada vez que se utiliza. ejecuta. La velocidad de la caché está entre el registro y la memoria, pero mucho más alta que la memoria. El tamaño de la caché es generalmente entre varios megabytes y más de diez megabytes.

El disco duro es un almacenamiento externo. El antiguo disco duro mecánico tiene un cabezal giratorio. Al leer el archivo del disco, el cabezal debe girarse a la posición correspondiente. La velocidad del disco es mucho menor que la de la memoria, y si la cabeza del disco permanece en una determinada posición, la información en diferentes posiciones en el disco aleatorio estará limitada por la velocidad física del movimiento de la cabeza, lo que resultará en una velocidad desigual. Los discos duros de estado sólido de nuevo estilo utilizan medios de almacenamiento similares a la memoria, lo que mejora enormemente el rendimiento del acceso aleatorio.

Por lo tanto, la computadora tiene una cabeza pequeña (registro) que solo puede recordar algunas cosas, pero puede tener una memoria rápida relativamente grande (caché), tiene una reserva de conocimiento (memoria) que supera con creces a los humanos y también lleva una gran cantidad Biblioteca (disco duro), por lo que desde el punto de vista del almacenamiento, la computadora es como un Rain Man con defectos de nacimiento.

Entonces, analicemos por qué la computadora hace qué tipo de operación en la ronda 1.

Primero miramos la definición de nuestra función

boolean isNumInArray(int num, int[] array) 

En la implementación subyacente de la función de llamada, los parámetros se asignan a dos registros. isNumInArrayCuando se llama a esta función, numel valor del primer parámetro 13se cargará en el registro (r1), y el segundo parámetro arrayde es solo arrayla información de dirección en la memoria cuando se pasa a la CPU , que se almacena en otro registro ( R2).

En la cuarta fila array[i] == num, cuando, la CPU debe hacer tres cosas antes de que pueda completar este trabajo:

  1. A través de la instrucción ADD, calcule la dirección de memoria que debe leerse de acuerdo con la dirección del arreglo (r2) y el número de i (r4)
  2. Cargue el número correspondiente a la dirección de memoria en el registro mediante la instrucción LOAD (r3)
  3. Compare el valor de num (r1) y r3 mediante la instrucción CMP y almacene el resultado en la memoria de resultados.

De acuerdo con el resultado de la operación 3, si el resultado no es igual, la CPU necesita iagregar 1 al contador de bucle y almacenarlo en el registro r4, y realizar el cálculo anterior nuevamente. La diferencia es que del segundo al enésimo paso dos será mucho más rápido que la primera vez, porque el caché ha capturado todo el contenido de la matriz.

Entonces, podemos ver por qué la computadora es tan estúpida al resolver este problema:

  1. La entrada de la computadora está restringida. Las computadoras solo pueden leer un valor a la vez (con la ayuda de un caché, lo cual no es tan malo) y poner un número limitado de valores en los registros, mientras que los humanos pueden leer múltiples valores a la vez y almacenarlos. en sus mentes a través de la visión y así sucesivamente.
  2. Las instrucciones de la computadora son limitadas y solo pueden admitir instrucciones aritméticas básicas. El cerebro humano puede tener una gran cantidad de instrucciones, como hacer coincidir el número 13 directamente a través del patrón visual de un montón de números recién vistos.

Encuentre un número específico en una matriz ordenada: cerebro humano vs computadora, ronda 2

La computadora fue derrotada en la última ronda de PK con el cerebro humano, pero esto no es muy justo, porque el número de matrices es solo unas pocas y el límite superior del almacenamiento de la computadora es mucho más que eso. Entonces comenzamos la segunda competencia. Esta vez ampliaremos la entrada

1 2 3 5 7 13 34 67 90127308502 ... 2341245 ... (1 millón

El número buscado se convierte en 2341245.

¿Qué tal el rendimiento del cerebro humano y la computadora esta vez?

Para una persona común, asumimos que estos 1 millón de números están impresos en un diccionario, entonces, ¿cómo puede encontrar un número en una matriz ordenada de 1 millón?

En este momento, la capacidad de "un ojo y diez líneas" de la que los humanos estamos orgullosos ya es muy pequeña. Cuando aumenta el número de dígitos, es difícil comparar si un número es el mismo que el número objetivo. Estas cifras son también muy pequeño.

Desde entonces, comparamos honestamente los números de principio a fin, pasando página por página para ver si hay números en la página actual, y si no, pasa a la página siguiente.

¿Esta idea te resulta muy familiar? Así es, este es el pensamiento de las computadoras, que es casi lo mismo que el código de computadora descrito en la sección anterior, excepto que la gente puede ver algunos datos más de un vistazo.

Sin embargo, la velocidad a la que los humanos comparan si los números grandes son iguales y la velocidad a la que pueden hojear el diccionario es mucho menor que la velocidad a la que una computadora puede leer estos 1 millón de números. También es un "pájaro estúpido" , que realiza millones de operaciones por segundo. Capacidad para completar dicha tarea casi al instante.

Es decir, en el caso de la entrada a gran escala, el modo de pensamiento del cerebro humano "degenera" para ser similar al de la computadora, pero es derrotado por la abrumadora ventaja de rendimiento de la computadora.

Encuentre un número específico en una matriz ordenada: cerebro humano vs computadora ronda 3

En la segunda ronda, el cerebro humano perdió ante la computadora, pero esta competencia es sin duda más rápida que dos pájaros estúpidos. ¿Existe una forma más inteligente?

Así es, hemos aprendido que el algoritmo de búsqueda binaria puede ser útil.

Paso 1: Hay un diccionario impreso con 1 millón de números frente a nosotros. No sabemos dónde estarán los números que estamos buscando, así que primero abrimos el diccionario por la mitad (no importa si no Hay que ser tan precisos), y mire la página actual El primer número y el último número, si el número que estamos buscando está dentro de este rango, si es así, podemos seguir buscando este número en la página actual.

Paso 2: Si el primer número de la página actual es aún mayor que el número que estamos buscando, entonces podemos romper la segunda mitad del diccionario (porque el número que estamos buscando no puede estar en la segunda mitad), continúe con el paso anterior.

Paso 3: Si el último número en la página actual es menor que el número que estamos buscando, entonces podemos romper la primera mitad del diccionario (el motivo es el mismo que el anterior) y continuar con el paso 1.

De esta forma, diremos que el diccionario se vuelve cada vez más fino. En el peor de los casos, arrancaremos hasta la última página. Esta página tiene este número o no tiene número, pero te garantizamos que no nos la perderemos siguiendo el pasos anteriores. Cualquier página que pueda contener este número.

Esta lógica es la misma que el principio de búsqueda binaria en los algoritmos informáticos. Veamos cómo se implementa el código del algoritmo real.

boolean isNumInArray(int num, int[] array, int start, int end) {	
	if(num < arr[start] || key > arr[end] || start > end){
		return false;				
	}
	
	int middle = (start + end) / 2; //找到对折点
	if(array[middle] > num) {
		return isNumInArray(arr, key, start, middle - 1); //撕掉后一半
	} else if(array[middle] < num){
		return isNumInArray(arr, key, middle + 1, end); //撕掉前一半
	}else {
		return middle;
	}	
}

Podemos ver que, comparado con la forma de pensar de los seres humanos, una computadora no pasa "una página", solo mira un número, pero otras formas de pensar son exactamente iguales. Utilizando este tipo de algoritmos, aunque los humanos siguen siendo más lentos que las computadoras en cuanto a resultados, ambas partes han encontrado el método más adecuado para lograr la mayor mejora en la autoeficiencia.

Encuentre un número específico en una matriz ordenada: más pensamiento

Entonces, cuando miramos hacia atrás, ¿por qué debería asumir que estos 1 millón de números están impresos en el diccionario? Porque el modelo de diccionario y memoria de computadora es muy similar.

La computadora puede acceder directamente a la memoria a través de la dirección de memoria, que es similar a pasar a una determinada página a través del número de página del diccionario.

En la codificación por computadora, podemos conocer la longitud de la matriz y encontrar el número del medio dividiéndolo por la mitad. El diccionario tiene grosor. Podemos encontrar el número de página central dividiendo el grosor por la mitad. Esto también es similar.

Imagínese, si el número de 1 millón no está impreso en un diccionario, sino en una carretera, ¿podemos seguir usando el algoritmo de la sección anterior para buscar carne humana? La respuesta es no, porque correr la mitad de la carretera consumirá mucha energía. Si usa el método de búsqueda binaria, solo hará que consuma más energía que el método más tonto de la primera ronda. Debido a que el concepto de almacenamiento en la carretera no se corresponde con el modelo de memoria, sino con el modelo de cinta. Para tal modelo, creo que, ya sea un humano o una computadora, el algoritmo debe ajustarse para lograr la mayor eficiencia.

para resumir

A través de los ejemplos anteriores, podemos ver que el algoritmo de la computadora es antihumano, porque la computadora no es una "persona normal", tiene sus propias deficiencias, pero también sus propias fortalezas. Muchas veces sentimos que el algoritmo no es intuitivo, no porque nuestra capacidad de pensamiento sea peor que la de la computadora, sino precisamente porque como seres humanos, estamos expuestos a demasiada información al mismo tiempo, y hay demasiadas cosas que nos bloquean. pensando. Entonces, en este momento, también podría "degenerarse" en una computadora con "miope" y "poco conocido". En este momento, es posible que tenga una idea más clara.

Supongo que te gusta

Origin blog.csdn.net/weixin_42981560/article/details/113114093
Recomendado
Clasificación