Para empezar con una simplificación excesiva:
Hay sólo unos pocos tipos básicos de estructuras de datos: arrays, listas y árboles. Todo lo demás se puede componer utilizando diferentes tipos de estas dos estructuras (por ejemplo, una tabla hash puede implementarse con una matriz para los valores hash y una lista para cada valor hash para manejar las colisiones).
De estas estructuras, las matrices son estáticas (es decir, su huella de memoria no varía con el tiempo a medida que se realizan operaciones) y todo lo demás es dinámico (es decir, en el caso general cambia la huella de memoria).
Las diferencias entre los dos tipos de estructuras pueden ser derivados de lo anterior:
- estático necesita el tamaño máximo a ser conocido de antemano, mientras dinámica puede adaptarse sobre la marcha
- estática no reasignar memoria no importa qué, por lo que puede tener requisitos de memoria garantizados
También hay otras diferencias, que sin embargo solo entran en juego si sus datos pueden ser ordenados. No puedo dar una lista extensa, ya que hay muchas estructuras dinámicas de datos que muestran diferentes características de rendimiento para diferentes operaciones ("agregar", "eliminar", "buscar") y por lo tanto no pueden colocarse todas bajo el mismo techo.
Una diferencia muy visible es que las matrices ordenadas requieren mover (posiblemente muchas) cosas en la memoria para cualquier operación que no sea "encontrar", mientras que las estructuras dinámicas generalmente realizan menos trabajo.
Así, para recapitular:
- Si necesita una garantía sobre el uso máximo de la memoria, no tiene otra opción que una matriz.
- Si tiene un límite superior difícil para su tamaño de datos, considere usar una matriz. Las matrices pueden ser aptas para problemas que requieren principalmente operaciones de agregar/quitar (mantener la matriz sin clasificar) y para aquellas que requieren principalmente operaciones de búsqueda (mantener la matriz ordenada), pero no para ambas al mismo tiempo.
- Si no tiene un límite superior difícil, o si necesita que todos los add/remove/find sean rápidos, use un tipo apropiado de estructura dinámica.
Editar: no he mencionado gráficos, otro tipo de estructura de datos dinámica que posiblemente no puede estar compuesta de partes más simples (por definición, un árbol tiene exactamente un enlace que va "en" cualquier nodo, excepto la raíz, mientras que los gráficos pueden tener más de uno). Sin embargo, los gráficos realmente no se pueden comparar con otras estructuras en un escenario "lo que sería mejor usar", porque o bien necesita usar un gráfico o no (otras estructuras pueden exhibir un rendimiento diferente, pero al final todas respaldan el mismo conjunto de operaciones).
En cierto nivel, una lista es solo un árbol degenerado. Se podría decir que hay dos tipos de estructuras de datos, bloqueadas y basadas en nodos (y varios híbridos de los dos). –
Además, no estoy de acuerdo con 1). No hay ninguna razón por la que no puedas escribir una clase "BoundedList" que genere un error (o lo que sea) cuando agregaste el elemento N + 1. Pero estoy de acuerdo en que esa no es exactamente una estructura de datos fundamental, más un hack. –
@Drew: tiene razón en ambos aspectos. A decir verdad, comencé a escribir sobre 2 tipos de estructuras y dejé árboles y gráficos, pero pensé que era seguro que alguien me corrigiera. Parece que no puedes evitar eso :-).En cuanto a la lista limitada, creo que estarás de acuerdo en que alguien al nivel de conocimiento implícito en la pregunta original no tiene nada que ganar si se le dice este tecnicismo. – Jon