Las estructuras de datos existen para estructurar y organizar los datos de una manera que permita buscarlos de una manera particular en menos de un tiempo lineal.
Digamos que tienes una lista de nombres. Por un momento, imagina que la lista es física. Es una hoja de papel, tal vez un libro si se hace grande. Los nombres en la lista no están en ningún orden en particular. ¿Cómo buscarías el nombre “Adam Smith”? Tendría que examinar la lista y ver todos los nombres. No tiene otra opción, ya que no sabe nada sobre dónde puede aparecer Adam Smith en su lista. Esa sería la vida sin estructuras de datos.
Simplemente mirar a través de la lista funciona bien cuando la lista solo tiene 20 nombres. ¡Pero imagínese si un directorio telefónico de toda la ciudad estuviera organizado de la misma manera! Nunca encontrarás nada en una cantidad de tiempo práctica. Para todos los efectos, el directorio sería inutilizable.
- ¿Puede Quantum Computing acelerar las redes neuronales y los algoritmos genéticos?
- ¿Cuáles son las aplicaciones prácticas e industriales de los algoritmos de búsqueda / recorrido de gráficos BFS y DFS?
- ¿Qué estructura de datos debo usar si estoy diseñando un algoritmo que clasifica las páginas por relevancia de acuerdo con la cantidad de veces que se ven?
- ¿Cómo se ordenan las matrices para que los valores altos y bajos se distribuyan en diagonal?
- Visión por computadora: las aplicaciones de Richard Szeliski ofrecen una buena (amorosa) montaña rusa a través de la historia de los algoritmos. ¿Cómo puedo usarlo mejor?
Entonces, a la gente se le ocurrió una idea diferente. Dijeron: “oye, clasifiquemos los nombres alfabéticamente”. Esto permite utilizar un algoritmo eficiente llamado búsqueda binaria. Puede pensar que el nombre suena elegante, pero ya sabe cómo hacerlo.
1. Abra el directorio en su punto medio (abra la página central) y mire el nombre allí.
2. Ahora sabe si el nombre que está buscando aparece antes o después del nombre que ve (a menos que lo vea allí mismo, en cuyo caso ya terminó). Si antes, su nombre está en la primera mitad de la lista. Si después, su nombre está en la segunda mitad.
3. Repita su búsqueda en la mitad relevante de la lista.
Este cambio estructural de cómo se organizaron los nombres ha hecho posible que los nombres se encuentren con bastante rapidez incluso en una gran colección de nombres . Con cada nombre que miramos, reducimos a la mitad las posibles ubicaciones de lo que estamos buscando. Matemáticamente, esto significa que podemos encontrar un nombre mirando aproximadamente [math] \ log_2 N [/ math] nombres, donde [math] N [/ math] es el número total de nombres. Tenga en cuenta que la búsqueda de un nombre en la lista desordenada habría requerido buscar los nombres [math] N [/ math] en el peor de los casos, y que [math] \ log_2 N << N [/ math] para grandes [math] N [/mates].
Lo anterior es una estructura de datos muy simple. Es tan simple que muchos programadores ni siquiera lo consideran una estructura de datos. Se llamaría una “matriz ordenada”. Ahora, resulta que si bien una matriz ordenada a veces es una buena estructura de datos, tiene muchas deficiencias, por lo que no hemos terminado nuestro viaje de estructuras de datos.
La desventaja más notable es que debe volver a imprimir todo el directorio telefónico si desea insertar un par de nombres adicionales. Los directorios telefónicos se imprimen una vez al año, y en ese momento se crea una nueva versión. Pero, ¿qué pasaría si necesitaras algo que esté siempre actualizado?
Bueno, hay una manera de estructurar los datos de manera que los datos nuevos sean fáciles de insertar rápidamente. Los programadores llaman a esta estructura de datos un “árbol” debido a la apariencia de algunas representaciones abstractas en papel. Hay muchos, muchos tipos diferentes de árboles. Aquí está la idea detrás de un tipo de árbol llamado árbol B +: en lugar de ordenar los datos alfabéticamente, tiene una página de índice que dice algo como:
A – AW (no incluye el límite superior): vaya a la página 45
AW – BG: vaya a la página 123
…
Cuando llegue a la página especificada, puede haber otra página de índice que subdivida aún más el rango, hasta que llegue a un rango tan pequeño que todos los nombres quepan en una página.
No mantenemos las páginas completamente llenas, de modo que cuando necesitamos escribir un nuevo nombre, simplemente encontramos la página a la que pertenecería y la escribimos allí. Si una página se llena y aún necesitamos agregar un nombre, la dividimos en 2 páginas, cada una ahora a la mitad, y modificamos la página de índice que nos llevó allí para reflejar el cambio. Con el tiempo, las páginas de índice también pueden llenarse, y luego tendremos que dividirlas también y modificar sus páginas de índice de nivel superior, etc.
Los árboles son algunas de las estructuras de datos más fundamentales, pero hay muchas otras.
Los gráficos representan entidades (personas, ciudades) y las relaciones entre ellas (amistades, vuelo de conexión). Hay mucha teoría sobre los gráficos que nos permite resolver problemas interesantes sobre ellos de una manera muy abstracta y general.
Los montones son como árboles de torneos (paréntesis de eliminación), con valores más altos (mejores jugadores) que dominan los valores más bajos (peores jugadores) y aparecen en la parte superior. La principal ventaja de los montones es que la eliminación de estilo de torneo es rápida (la construcción de un montón es rápida) y puedes conocer de manera muy eficiente a los mejores jugadores o a los mejores jugadores de la pareja.
Las tablas hash son estructuras de datos que calculan el espacio correcto para almacenar un objeto únicamente en función de su contenido. Imagínese si un garaje determinara dónde estacionaría su automóvil basándose en un cálculo matemático que involucra su número de placa, de modo que cuando quisiera encontrar su automóvil, repetiría el cálculo y sabría dónde está.
Los árboles de rango pueden buscar eficientemente todos los puntos ubicados dentro de un rectángulo especificado en el plano bidimensional. Piense en buscar restaurantes cercanos en un mapa, dada su ubicación actual.
—-
En cuanto a la relación con los algoritmos, muchos algoritmos necesitan buscar ciertos tipos de datos de manera eficiente. Las estructuras de datos aceleran ese proceso sobre lo que se lograría si los datos se almacenaran sin ningún orden en particular en una matriz.
Gracias por el A2A.