Es muy fácil para alguien que tiene una comprensión fundamental de las computadoras responder esta pregunta, pero la mayoría de las personas la responden de una manera que otras personas con una comprensión fundamental de la computadora entienden.
Contestaré esta pregunta abordando los fundamentos primero, porque lo estoy dirigiendo al laico. Se alargará mucho. Con suerte, será útil y le dará una mayor apreciación de la programación.
¿Qué es un programa de computadora? Un programa de computadora es un conjunto de instrucciones escritas en lenguaje de máquina que le indican a la CPU de la computadora qué hacer. Como tal, una CPU es un dispositivo bastante rudimentario pero potente. Es un chip con un montón de circuitos lógicos integrados. Puede almacenar algunos datos dentro del chip en circuitos llamados registros, puede modificar esos registros y realizar ciertas operaciones. También tiene pines por los que se comunica con el mundo exterior. En lo que respecta a la CPU, el mundo entero existe al final de sus pines. Es como una araña ciega, sintiendo el estado del universo a través de las vibraciones en su red. Los pines son pines de entrada (los datos entran a través de los pines de entrada), pines de salida (los datos salen a través de los pines) y pines de control (las instrucciones entran a través de estos pines). Los pines de control son realmente especiales. Proporcionar combinaciones de 1s y 0s a los pines de control activa diferentes circuitos en el chip. Una combinación hace que agregue 2 registros. Otro lo hace restarlos. Otra combinación le dice que obtenga datos de sus pines de entrada. Otro más le dice que envíe datos a sus pines de salida. Estas combinaciones de 1s y 0s en los pines de control, llamados códigos de operación (abreviatura de códigos de operación), son los hilos que hacen bailar al títere.
Ahora, un programa de computadora no es más que una serie de códigos de operación. Los alimentas a la CPU en el orden correcto, y la CPU baila a tu ritmo. Cada computadora en el mundo está compuesta de
- ¿Por qué el aprendizaje profundo requiere la construcción de modelos de datos generativos?
- Cómo ordenar una matriz 2D de tipo char utilizando la función C ++ sort () o qsort ()
- ¿Qué algoritmos se pueden usar para determinar si dos preguntas (como las de Quora) son de alguna manera similares?
- ¿Cómo se puede observar fácilmente que la complejidad temporal del código escrito es exponencial?
- ¿Es una burbuja una forma muy lenta de ordenar los elementos en comparación con los otros tipos? En caso afirmativo, ¿por qué?
a) una CPU,
b) un mecanismo por el cual los códigos de operación se introducen en la CPU,
c) un mecanismo por el cual la CPU puede almacenar información mientras no tiene los datos en sus registros
d) un mecanismo por el cual la computadora puede hablar con otras computadoras y
e) un par de mecanismos por los cuales un operador humano puede suministrar información a la computadora y obtener información de la computadora
No importa si es su PC, su teléfono inteligente o una computadora de los años 70 del tamaño de una casa. Todas las computadoras, fundamentalmente, tienen estas 5 partes de una manera u otra, y el programa de computadora es lo que hace que todas estas funcionen juntas
¿Qué es una estructura de datos?
Entonces, todo eso está muy bien, y entendemos lo que puede hacer una CPU, pero no hemos abordado lo que una CPU no puede hacer. La CPU, por sí sola, es la araña ciega. La araña ciega siente que es telaraña y comprende lo que está sucediendo. Pero no tiene idea de si la web está en un árbol o en un edificio de gran altura. No sabe si está en una choza de indigentes o en la oficina del presidente. La CPU entiende que hay estos periféricos conectados a ella. No tiene idea de qué problema resuelven estos periféricos. Sabe que hay algunos periféricos conectados a sus pines de salida en la dirección 0x3000. No sabe que es un monitor. El monitor podría estar mostrando fotos familiares, o pornografía, o la imagen de Cristo, o una mujer siendo violada. No tiene idea! Todo lo que sabe es que está enviando algunos datos a esa dirección.
Pero a los operadores humanos se les dice que usen computadoras para resolver problemas humanos. Todo lo que hace la computadora es en el contexto de algo más grande que la computadora no tiene la capacidad de entender. ¿Puede una araña ciega volar un avión? u operar un dispositivo médico? ¿O ayudarlo a mantenerse en contacto con un ser querido a 3000 millas de distancia? Este es el trabajo principal y el desafío fundamental de cualquier programador. Tome una solución ideada por un humano a un problema humano y conviértala en una serie de códigos de operación que cuando se alimentan a la computadora resuelven ese problema
¿Cómo hacen eso los programadores? Crean abstracciones … muchas y muchas abstracciones. Las abstracciones son como su nombre sugiere representaciones abstractas de las cosas. Actúan como un puente entre cómo piensan los humanos y cómo operan las computadoras. Las abstracciones permiten a los programadores expresar lo que hace un programa de computadora sin tener que recordar la serie de códigos de operación. Esto los hace más fáciles de entender y comunicar.
Inicialmente comenzaron con abstracciones de nivel inferior. Las abstracciones de nivel inferior están más cerca de cómo funcionan las computadoras, abstracciones que podrían traducirse fácilmente en código de computadora. Finalmente llegaron a un acuerdo sobre un conjunto estándar de abstracciones. Luego construyeron compiladores que tomaron un programa escrito en un lenguaje que se refiere a las abstracciones que generan códigos de operación. Esto les permitió construir abstracciones sobre las abstracciones que hicieron que esas abstracciones se acercaran más a cómo piensan los humanos. Ahora, en los últimos 60 años, son abstracciones sobre abstracciones. Son arañas ciegas hasta el fondo. La mayoría de los programadores novatos hoy en día ni siquiera entienden lo que hace la CPU bajo el capó. No necesitan hacerlo porque alguien más lo ha cuidado y les ha dado una abstracción
Una estructura de datos es una abstracción de muy bajo nivel . Es por eso que es más difícil de explicar pero fácil de entender para las personas que entienden cómo funcionan las computadoras. Es una de las primeras cosas que te enseñan en la universidad, y también lo primero que te hace tropezar, porque es la primera vez que te enfrentas a la abstracción. De repente pasas de aprender “así es como una CPU transfiere datos” a “aquí hay algo de lo que nunca has oído hablar en tu vida y no puedes relacionarte, pero de todos modos debes entenderlo”
Las estructuras de datos son herramientas abstractas que describen cómo se pueden organizar los datos. Recuerde, la CPU no tiene idea de qué necesidad humana está tratando de satisfacer. Este dato que intenta mantener podría ser cualquier cosa. Podría ser una lista de compras, o podría ser la tabla de contenido de un libro. No tiene idea! La forma de organizar una lista de compras es fundamentalmente diferente de cómo organizar una tabla de contenido. Entonces, con el tiempo, los programadores han acordado varias formas estándar de organizar la información y les han dado nombres estándar, y todas estas descripciones abstractas de cómo deben organizarse los datos se denominan estructuras de datos.
¿Qué es una lista? Una lista está bien … lista. Todos tienen listas. Tiene listas de tareas, listas de compras y listas de deseos. De hecho, sería bastante apático sin listas. Los humanos tienen una noción muy difusa de las listas. Sin embargo, los programadores tienen una noción muy precisa pero abstracta de las listas. Una lista es
a) una estructura de datos que contiene otros datos de piezas múltiples. No importa qué datos contenga. Podrían ser monedas de oro o canicas para niños. No importa Una lista es una cosa abstracta. Simplemente describe cómo se guardan los datos. No es lo que se lleva a cabo. Podrías sostener cualquier cosa. Podrías tomar todo el té en China si tienes una lista
b) puede contener el mismo dato varias veces sin quejarse. Puede agregar plátanos, naranjas y luego plátanos nuevamente. No hay problema. No haces eso con una lista de compras. En una lista de compras. Un elemento puede aparecer solo una vez. Eso no es una lista. Eso es un conjunto. Cuando los programadores crean abstracciones, se inspiran en sus contrapartes de la vida real, pero eso no significa que la abstracción tenga que adherirse a la contraparte de la vida real. Para que una abstracción sea útil, tiene que ser precisa y no importa si es fiel a la parte exterior de la vida real. Entonces, una lista de compras es un Conjunto, y todos están de acuerdo con ella siempre y cuando todos tengan un entendimiento común
c) Se ordena una lista. Pones algo en una lista, se queda ahí, justo donde lo pones. No es como mi esposa que sigue “organizando” mi escritorio para mí. No Cuando coloca los datos en una lista, es antes de algún otro dato, y después de otro dato, y no importa cuántas veces lo mire, el orden no cambia. Además, las cosas no pueden estar una al lado de la otra o una encima de la otra o tener relaciones sexuales entre ellas. No Todo es antes o después de otra cosa, y no se tocan. Es como un tren, pero no se llama Tren porque lo dijimos
d) Una lista le permite repasar todos los elementos que contiene uno por uno en el orden en que se colocó. Esto se llama iterar. Le permite ir al elemento que se encuentra en la enésima posición. Le permite insertar algo en el medio o al principio o al final, le permite eliminar un elemento
Ahora, como puede ver, esta es una noción muy precisa pero muy abstracta. Y de esto se trata la programación. Una lista es una herramienta. Entiende la herramienta y aprende otras herramientas que funcionan con estas herramientas. Luego observa una solución ideada por un problema humano a humano y descubre cómo resolverá ese problema utilizando estas herramientas. Una vez que haya resuelto el problema que alguien más ha resuelto utilizando este conjunto específico de herramientas, convertir la solución a un programa de computadora es un trabajo duro. En cierto modo, no es diferente a ser fontanero o carpintero. Aprendes cómo usar las herramientas y cuándo usarlas y luego las aplicas … excepto que todas nuestras herramientas son producto de la imaginación, y tenemos que mantener estos objetos en nuestras cabezas para hacerlos realidad. Es por eso que hacemos mucho dinero, y usted no: p
¿Qué es una lista vinculada?
Una lista vinculada es una forma específica de hacer una lista.
Una manera fácil de hacer una lista es mantener las cosas una al lado de la otra en la memoria. Entonces, supongamos que su lista contiene thingamajigs, y cada thingamajig tiene exactamente 20 bytes. Entonces, los bytes 2001-2020 contienen la cosa 1, y 2021-2040 contienen la cosa 2, y así sucesivamente. Esto se llama ArrayList, porque es una lista hecha usando una matriz (que es lo que los programadores de computadoras llaman todo lo que se hace al poner las cosas una al lado de la otra) Es muy fácil iterar sobre esto y obtener el enésimo elemento. Si sabe dónde comienza la lista, sabe dónde comienza cada elemento de la lista haciendo un cálculo simple. No es cada uno insertar cosas intermedias en una ArrayList. Porque, si quieres poner un elemento en la posición N., eso significa que cada elemento desde N + 1 hasta el final tiene que cambiar un lugar … y si tienes elementos grandes, entonces sus gordos traseros no se mueven fácilmente. Piense en una ArrayList como la cola en el DMV donde le dan el número. Una vez que tienes un número, lo tienes. Es muy difícil para el DMV agregar a alguien en el medio. ¡Tendrán que ir y cambiar los números de todos!
Una lista vinculada resuelve este problema mediante la vinculación. En una lista vinculada, cada elemento de la lista sabe que el siguiente elemento de la lista es No todos tienen que sentarse uno al lado del otro. Entonces, cuando estás iterando sobre la lista, ¿solo necesitas saber quién es el primero? Digamos que Suzy es primero. Trabajas en Suzy y le preguntas “¿Quién es la próxima?” Suzy dice que Amy es la próxima. ¿Trabajas en Amy y le preguntas quién es el próximo? Amy dice que Lara es la siguiente … y así sucesivamente. Facilita eliminar o agregar a alguien. Digamos que querías que Christie estuviera entre Amy y Lara. Le dices a Amy “Ok Christie es la próxima, no te preocupes por Lara” y le dices a Christie: “Lara es la próxima”. Es mucho más difícil ir al enésimo elemento de la lista. porque tendrás que ir a cada persona y preguntar quién es el siguiente. Esto se denomina lista vinculada porque cada elemento tiene un enlace al siguiente elemento de la lista. Si cada elemento tenía un enlace tanto al anterior como al siguiente, entonces se llama Lista Doblemente Vinculada … porque está vinculado de 2 maneras. Sí, cuando hacemos nuestras abstracciones, tomamos prestadas palabras del inglés del siglo XIV, o algunas veces inventamos nuestras propias palabras. Por eso hacemos mucho dinero. Se llama ser muy creativo.
Como puede ver, una lista vinculada es bastante buena cuando revisa principalmente los datos en orden (iterando) o agregando y eliminando elementos intermedios. Pero, es horrible si quieres encontrar cosas.
Lo que es más interesante que una lista vinculada es que su primo más joven pero más inteligente se llama Skip List. No, una Lista de saltos no es una lista que salta al trabajo. Una lista de omisión es una lista que le permite omitir partes de ella. La mayoría de los motores de búsqueda usan listas de omisión.
Digamos que usted es Google y desea indexar todo Internet y facilitar la búsqueda de cualquier persona mediante cualquier término. Entonces, alguien podría acercarse a usted y decirle que busque “bollos picantes” y desea darles todas las páginas web que mencionan los bollos picantes. Entonces, lo primero que debe hacer es buscar todas las páginas web del mundo y averiguar qué términos contienen. Digamos que tiene un millón de páginas (en realidad tenemos más de 4 mil millones de páginas web … pero no nos volvamos locos), de las cuales 250,000 dicen hot, 80,000 dicen bollos. No sabe cómo decir amy hot and bollos, y su trabajo es resolverlo en una centésima de segundo. ¿Cómo resolverás este problema humano?
Una forma de hacerlo es. asigne a cada página web un número único. Luego, para cada término posible, cree una lista vinculada. Todas estas listas están siempre en el mismo orden, incluso si les faltan elementos. Usando estas listas, usted sabe que la primera página web que tiene palabras calientes es la página web número 43, y la siguiente es la página web # 755, luego la # 759 y así sucesivamente. Entonces, ¿cómo encuentras una página web que tenga bollos AND calientes? Comprueba esas listas una contra la otra. Verá el primer documento que tiene hot # 43 y el primero que tiene bollos (# 22). Si son iguales, encontró una página web que dice hot y bollos. Si no son lo mismo … entonces vas al siguiente en el que está detrás hasta que se adelanta al siguiente o encuentras una coincidencia. Si uno se adelanta al otro, avanza el que está detrás. Sigue haciendo esto hasta que termines ambas listas
Pero hay un problema aquí. Digamos que el hot estuvo en el # 43 y luego el # 755 y los bollos en todas las páginas web desde el # 44 al # 754. Ahora, si estaba verificando estas listas entre sí utilizando una lista vinculada, deberá iterar sobre los bollos 710 veces. Ahora, puedes ser un hombre de bollos, pero lidiar con 710 bollos fríos puede ser tedioso. Ya sabes que no quieres bollos en los documentos antes del # 755, ¿no puedes simplemente saltarte ? Bueno, por eso tienes una lista de saltos. En una lista de omisión, ot solo cada elemento sabe qué elemento está detrás de él, sabe qué elemento está 10 elementos detrás de él, y 100 elementos detrás de él, y 1000 elementos detrás de él, y así sucesivamente. Entonces, cuando el programa vea que necesita pasar del # 43 al # 755, avanzará en 100 segundos, en lugar de moverse uno por uno
¿No es asombroso? Un tipo llamado William Pugh inventó las listas de salto. Aquí está él
No, no estoy bromeando. Ese es literalmente el tipo que inventó las listas de omisión. Se doctoró en Cornell y ahora es profesor en la Universidad de Maryland. Pasó un año en Google y aprendió a comer fuego. Aquí está su tesis sobre las listas de omisión. http://citeseerx.ist.psu.edu/vie…