¿Cuál es la relación entre las estructuras de datos y los algoritmos? [cerrado]

13

He estado buscando un buen curso en línea en estructuras de datos, pero descubrí que Google también devuelve resultados para cursos de algoritmos, que dicen cosas como:

En este curso aprenderá varios principios fundamentales del diseño de algoritmos: métodos de dividir y conquistar, algoritmos de gráficos, estructuras prácticas de datos (montones, tablas hash, árboles de búsqueda) , algoritmos aleatorios y más. [fuente]

y

Al final de esta clase, comprenderá los conceptos clave necesarios para diseñar nuevos algoritmos para gráficos y otras estructuras de datos importantes y para evaluar la eficiencia de estos algoritmos. [fuente]

y

Este curso proporciona una introducción al modelado matemático de problemas computacionales. Cubre los algoritmos comunes, los paradigmas algorítmicos y las estructuras de datos utilizadas para resolver estos problemas . [fuente]

Mi pregunta es: ¿los algoritmos y las estructuras de datos están íntimamente relacionados, lo que significa que deben entenderse juntos o es un tema más fundamental que el otro?

EDITAR: Para aquellos que voten para cerrar esta pregunta, ¿podrían decirme por qué y tal vez cómo mejorarla? Aprender a hacer las preguntas correctas es parte del proceso educativo.

gwg
fuente
17
Una estructura de datos es estática y no puede hacer nada. Un algoritmo es solo un conjunto de instrucciones para realizar en algunos datos. Sin uno, el otro es inútil. Juntos, hacen programas de computadora. Los dos son fundamentales.
Phoshi
2
@Phoshi mal. La estructura de datos está estrechamente vinculada a los algoritmos que manipulan los datos. Tan estrechamente vinculados, esos algoritmos se consideran parte de la estructura de datos. Por ejemplo, la estructura de datos de la Lista alineada le dice cómo se guardan los datos y también cómo se leen y manipulan.
Eufórico
77
@Euphoric Yo diría que está mal decir que los algoritmos son parte de la estructura de datos. Hay más de una forma de implementar una búsqueda binaria: puede, por ejemplo, hacer una if less than recurse to the left; if greater than, recurse to the right; if equal, returnbúsqueda ingenua o un poco más sofisticada if less than recurse to the left; otherwise keep track of this value as a potential candidate and recurse to the right; check for equality once we reach the leaves. Tienen números ligeramente diferentes de comparaciones. Ambas son una de las muchas cosas que puedes elegir hacer con un árbol.
Doval
44
@Euphoric Estás confundiendo la estructura de datos con el tipo de datos abstractos que implementa la combinación de estructura de datos y algoritmos.
Doval
77
@Eufórico, tengo que estar en desacuerdo. ordenar de fusión es un algoritmo. Una matriz es una estructura de datos. Una lista vinculada es una estructura de datos diferente. Puedo escribir una implementación de MergeSort para operar en cualquiera de los dos. Algunas estructuras de datos pueden ser más naturales o más eficientes para un algoritmo particular, pero rara vez es un requisito absoluto (es necesario tener un montón para implementar la ordenación del montón). Nicholas Wirth escribió un libro de texto popular en la década de 1980 titulado: "Algoritmos + Estructuras de datos = Programas"
Charles E. Grant

Respuestas:

20

Existen todo tipo de mezclas. Tiene estructuras de datos, que no están asociadas con algoritmos, algoritmos, que no requieren estructuras de datos (reales), pero la mayoría de las veces vienen en un paquete.

Editar: como @Doval señaló correctamente, las estructuras de datos per se no tienen ninguna operación asociada con ellas. El acto de combinar la estructura de datos y el algoritmo forma un tipo de datos abstracto.

Estructuras de datos sin algoritmos.

Considere, por ejemplo, una estructura de datos para almacenar coordenadas bidimensionales, llamadas apropiadamente Point. No hay mucho en términos de algoritmos que ser hecho por un punto y realmente es sólo un contenedor para una xy yvalor. Por supuesto, al dar esta estructura de datos, ahora puede agregar todo tipo de algoritmos (cálculo de distancia, cascos convexos, lo que sea que tenga).

Puede pensar en muchas estructuras de datos, que son simplemente una acumulación de datos individuales. Si bien esto ocurre con frecuencia en la práctica, no es un buen material de enseñanza, porque no hay nada que aprender de él, una vez que haya entendido, que los elementos de datos individuales se pueden acumular en una nueva estructura de datos (como lo que aprende después del Pointejemplo anterior , si le proporciono esa asombrosa estructura de datos llamada Point3D, ¿qué puede hacer lo mismo para el espacio tridimensional?)

Algoritmos sin estructuras de datos (reales)

"Real", porque obviamente cada algoritmo interesante necesita tipos de datos primitivos como enteros o booleanos, y no queremos considerarlos como estructuras de datos en este contexto. De manera similar a lo anterior, estos algoritmos suelen ser bastante simples. En particular, no vienen con un estado complicado de ningún tipo, porque eso generalmente entra en una estructura de datos (ver la siguiente sección).

Un ejemplo para tal algoritmo sería calcular el máximo común divisor de dos números. Los algoritmos de Euklid para el mcd solo necesitan tener dos enteros y los manipula.

Sin embargo, una vez que las cosas comienzan a ponerse más interesantes, muy pronto ingresas al mundo de los tipos de datos abstractos. Por ejemplo, el tamiz de Eratóstenes se basa en una matriz. Podríamos tener una discusión ahora, si una matriz sigue siendo primitiva, o de hecho, podría discutir si un entero no es ya una estructura de datos. De cualquier manera, los algoritmos que existen completamente sin estructuras de datos son bastante aburridos, incluso si acepta su existencia aislada.

Algoritmos combinados con estructuras de datos, también conocidos como tipos de datos abstractos.

Ahora estos son los interesantes, pero por dos razones muy diferentes. Por lo general, puede abordarlos desde dos direcciones: primero la estructura de datos o el algoritmo primero.

Si bien un tipo de datos abstractos se define por la combinación de estructura de datos + algoritmos / operaciones, a menudo los vemos con un enfoque en cualquiera de ellos y consideramos el otro como habilitadores.

Estructura de datos, luego algoritmo

Encontrará tipos de datos abstractos, que son bastante simples de usar, pero involucran algoritmos más o menos complicados para que funcionen internamente. Por ejemplo, a HashMapes trivial de usar, pero implica una función hash ingeniosa y se ocupa de las colisiones hash en el interior. Sin embargo, desde su punto de vista como usuario, le importa como algo que contiene datos para usted, no algo que haga algo por usted.

A diferencia del último grupo a continuación, estas estructuras de datos no exponen a sus usuarios a estos algoritmos. No necesita saber ni preocuparse por HashMapla función interna de hash para poder usarla. (Sin embargo, para usarlo de manera efectiva, es posible que desee saber estas cosas;)

Algoritmo, luego estructura de datos

La otra dirección significa que tiene un algoritmo, que desea poder usar simplemente, pero que necesita estructuras de datos internamente para que funcione como se esperaba. Un ejemplo sería un algoritmo de particionamiento de espacio binario (BSP), que simplemente puede solicitar el bidimensional Pointde un gran conjunto de puntos que está más cerca de un punto de consulta dado. Sin embargo, necesita una estructura de árbol (e incluso algoritmos adicionales como cálculos de distancia) en el interior para escribir realmente el algoritmo.

En general, se puede decir que los algoritmos en este grupo usan estructuras de datos involucradas para su representación interna del estado. Yo diría que este grupo de algoritmos es el más diverso y encontrará muchos muchos diferentes que se ajustan a este esquema general. Con respecto al punto de vista, los vemos interesantes, porque hacen algo (por ejemplo, clasificación) por nosotros y no nos importa tanto la parte que contiene los datos.

Estructuras de datos y algoritmos estrechamente relacionados.

Finalmente, tiene estructuras de datos, que están muy relacionadas con algoritmos que se corresponden directamente con ellas. Un ejemplo típico es un árbol binario, que, cuando desea hacer algo significativo con él, le impone el tema de los algoritmos de caminar por el árbol (primero en profundidad, primero en amplitud, lo que sea).

Para estos casos, cambiamos de vez en cuando el enfoque de nuestra visión de los tipos de datos abstractos resultantes. A veces te importa la estructura de tu árbol, unos minutos más tarde te importa poder ejecutar una operación de búsqueda en él, luego te preguntas sobre eliminar un nodo y enseguida cómo se ve la estructura después. Si bien todo esto también es válido para las otras secciones anteriores, no es algo que sea el foco principal en su mente, por ejemplo, cuando almacena / recupera datos a / desde una Map, o cuando ordena una lista vinculada.

Franco
fuente
1
Estás combinando estructuras de datos y tipos de datos abstractos. Una estructura de datos no hace nada . No tiene sentido decir "encontrará estructuras de datos, que son bastante simples de usar" porque una estructura de datos es solo una estructura. A Mapes un tipo de datos abstractos que puede implementarse utilizando una estructura de datos particular y un conjunto de algoritmos que producen los resultados deseados atravesando y manipulando la estructura. La estructura de datos no oculta los algoritmos, porque no tiene ninguno; el tipo de datos abstractos oculta la estructura de datos (eso es lo que lo hace abstracto)
Doval
Tenga en cuenta que, en cierto sentido, los algoritmos siempre están ocultos porque no hay forma de inspeccionar las funciones. Probablemente por eso se llaman abstracciones en el cálculo lambda (cuyo único tipo de datos son las funciones).
Doval
2
Estás en lo correcto. Sin embargo, veo una distinción entre cómo vemos los diferentes ADT. He editado mi respuesta y espero que ahora sea más clara y ya no combine la estructura con los ADT, sin dejar de enfatizar que puede centrarse en la estructura y / o las operaciones para cualquier ADT.
Frank
¿Es realmente demasiado simple decir que las estructuras de datos son sustantivos y los algoritmos son verbos? Supongo que podría decir que el algoritmo es la implementación del verbo, pero aún busca un árbol , incluso si esa búsqueda es una búsqueda binaria. Te perderías todos los detalles técnicos al decirlo, pero tiene cierta elegancia.
Magus
@Doval: incluso si una estructura de datos que consiste simplemente en un conjunto de números en una matriz que deben tener y mantener alguna relación entre sí, tal cosa puede ser "fácil de usar" si es fácil mantener las invariantes requeridas mientras hace lo que uno quiere, o "difícil de usar" si es difícil.
supercat
5

Las estructuras de datos a menudo influyen en los detalles de un algoritmo. Debido a esto, los dos a menudo van de la mano.

Considere, por ejemplo, un algoritmo para cortar su césped. Es probable que la estructura real de su césped influya en cómo corta el césped. Si vive en una casa pequeña en un suburbio densamente poblado y su césped es solo un pequeño rectángulo de unos pocos metros cuadrados de área, probablemente preferiría cortar su césped con una segadora en lugar de un tractor / segadora. Si su césped involucra muchos acres de terreno plano de pradera, su preferencia puede ser la cortadora de césped en lugar de la segadora de empuje (aunque eventualmente cualquiera de ellas puede hacer el trabajo). Si su césped involucra acres de tierra con grandes áreas planas, pero algunas colinas pequeñas y varios árboles, puede desarrollar un algoritmo más interesante para cortar el césped que involucra tanto una cortadora de césped como una segadora de empuje, o alguna otra hierba Técnicas de corte.

Sin embargo, en última instancia, la estructura de sus datos puede tener un impacto significativo en sus decisiones sobre cómo desarrollar su algoritmo (o qué algoritmos usar). Por esta razón, los dos temas a menudo van de la mano.

Y viceversa: a veces el algoritmo que queremos usar influye (al menos al comienzo de la informática) en las estructuras de datos que desarrollas para admitir el algoritmo. Por ejemplo, pasar de una lista de matriz a la idea de una lista vinculada y, finalmente, a un BST para almacenar una lista ordenada que permita una búsqueda rápida.

YoungJohn
fuente