Estructuras de datos 101: Arrays – Una introducción visual para principiantes

Conoce las estructuras de datos que utilizas a diario.

👋 ¡Bienvenido! Empecemos con un poco de contexto vital. Déjame preguntarte esto: ¡
✅ ¿Escuchas música en tu smartphone?
✅ ¿Mantienes una lista de contactos en tu teléfono?
✅ ¿Has visto alguna vez una tabla de clasificación durante una competición?

Si tu respuesta es «sí» a alguna de estas preguntas, entonces es casi seguro que has utilizado arrays y ni siquiera lo sabías! 😃 Los arrays son estructuras de datos muy potentes que almacenan listas de elementos. Tienen infinidad de aplicaciones. Son muy importantes en el mundo de la informática.

En este artículo, aprenderás los pros y los contras de los arrays, su estructura, operaciones y casos de uso.

¡Comencemos! 👍

🔎 Inmersión profunda en la estructura básica de los arrays

Para entender cómo funcionan, es muy útil visualizar la memoria de tu ordenador como una cuadrícula, como la de abajo. Cada pieza de información se almacena en uno de esos pequeños elementos (cuadrados) que conforman la rejilla.

Los arrays aprovechan esta estructura de «rejilla» para almacenar listas de información relacionada en ubicaciones de memoria adyacentes para garantizar una eficiencia extrema para encontrar esos valores. 🔳🔳🔳🔳 🔳

Puedes pensar en los arrays así:

Sus elementos están uno al lado del otro en la memoria. Si necesitas acceder a más de uno de ellos, el proceso está extremadamente optimizado porque tu ordenador ya sabe dónde se encuentra el valor.

Impresionante, ¿verdad? ¡Aprendamos cómo funciona esto entre bastidores! 😃

📚 Clasificación

Los arrays se clasifican como Estructuras de Datos Homogéneas porque almacenan elementos del mismo tipo.

Pueden almacenar números, cadenas, valores booleanos (verdadero y falso), caracteres, objetos, etc. Pero una vez que defina el tipo de valores que su matriz almacenará, todos sus elementos deben ser de ese mismo tipo. No puedes «mezclar» diferentes tipos de datos.

👀 Lectura de valores – ¡Comienza la magia!

El increíble poder de los arrays proviene de su eficiencia para acceder a los valores. Esto se consigue gracias a su estructura tipo rejilla. Veamos esto con más detalle.🔍

Cuando creas un array, tú:
– Lo asignas a una variable. 👈
– Definir el tipo de elementos que almacenará. 🎈
– Definir su tamaño (el número máximo de elementos). 📚

💡 Nota: El nombre que asignes a esta variable es muy importante porque lo utilizarás más adelante en tu código para acceder a los valores y modificar el array.

¿Pero cómo puedes decirle al ordenador a qué valor concreto quieres acceder? Aquí es donde los índices juegan un papel vital.

1️⃣ Índices

Para acceder a un valor de un array se utiliza lo que se llama un «índice» («índices» en plural). Se trata de un número que hace referencia a la ubicación donde se almacena el valor.

Como puedes ver en el diagrama de abajo, se hace referencia al primer elemento del array utilizando el índice 0. A medida que se avanza hacia la derecha, el índice aumenta en uno por cada espacio en la memoria.

💡 Nota: Sé que al principio parece extraño empezar a contar desde 0 en lugar de 1, pero esto se llama numeración basada en el cero. Es muy común en informática.

La sintaxis general para acceder a un elemento es: <ArrayVariable>

Por ejemplo:
Si tu array está almacenado en la variable myArray y quieres acceder al primer elemento (en el índice 0), utilizarías myArray

2️⃣ Memoria

Ahora que sabes cómo acceder a los valores, vamos a ver cómo se almacenan los arrays en la memoria de tu ordenador. Cuando defines el tamaño del array, todo ese espacio en memoria queda «reservado» desde ese momento para futuros valores que quieras insertar.

💡 Nota: Si no llenas el array con valores, ese espacio se mantendrá reservado y vacío hasta que lo hagas.

Por ejemplo:
Digamos que defines un array de tamaño 5 pero sólo insertas un valor. Todo ese espacio restante estará vacío y «reservado» en la memoria, a la espera de futuras asignaciones.

Esto es clave porque los arrays son extremadamente eficientes en el acceso a los valores porque todos los elementos se almacenan en espacios contiguos en la memoria. De esta manera, el ordenador sabe exactamente dónde buscar para encontrar la información solicitada.

Pero… hay un inconveniente 😞 porque esto no es eficiente desde el punto de vista de la memoria. Estás reservando memoria para futuras operaciones que pueden no ocurrir. Por eso se recomiendan los arrays en situaciones en las que se sabe de antemano cuántos elementos se van a almacenar.

🔧 Operaciones: ¡entre bastidores!

Ahora que ya sabes qué son los arrays cuando se usan, y cómo almacenan elementos, vamos a sumergirnos en sus operaciones como la inserción y la eliminación.

1️⃣ Inserción – ¡Bienvenido!

Digamos que tenemos un array de tamaño 6 y que todavía hay un espacio vacío. Queremos insertar un elemento «e» al principio del array (índice 0), pero ese lugar ya está ocupado por el elemento «a». ¿Qué debemos hacer?

Para insertar en arrays, movemos todos los elementos situados a la derecha del lugar de inserción, un índice a la derecha. El elemento «a» estará ahora en el índice 1, el elemento «b» estará en el índice 2 y así sucesivamente…

💡 Nota: Tendrás que crear una variable para llevar la cuenta del último índice que contiene elementos. En el diagrama anterior, el array se llena hasta el índice 4 antes de la inserción. De esta manera, puedes determinar si el array está lleno y qué índice debes utilizar para insertar un elemento al final.

Después de hacer esto, nuestro elemento se inserta con éxito. 👏

⚠️ ¡Un momento! Qué pasa si el array está lleno?

¿Qué crees que pasará si el array está lleno y tratas de insertar un elemento? 😱

En este caso, tienes que crear un nuevo array más grande y copiar manualmente todos los elementos en este nuevo array. Esta operación es muy costosa, en términos de tiempo. Imagina lo que pasaría si tuvieras un array con millones de elementos. Eso podría tomar un tiempo muy largo para completar. ⏳

💡 Nota: La única excepción a esta regla, cuando la inserción es muy rápida, es cuando se inserta un elemento al final del array (en el índice situado a la derecha del último elemento) y todavía hay espacio disponible. Esto se hace en tiempo constante O(1).

2️⃣ Borrado- ¡Adiós, adiós!

Ahora digamos que quieres borrar un elemento del array.

Para mantener la eficiencia del acceso aleatorio (poder acceder al array a través de un índice de forma extremadamente rápida) los elementos deben estar almacenados en espacios contiguos de memoria. No puedes simplemente borrar el elemento y dejar ese espacio vacío.

Debes mover los elementos que vienen después del elemento que quieres borrar un índice a la izquierda.

Y finalmente, tienes este array resultante 👇. Como puedes ver, «b» ha sido borrado con éxito.

💡 Nota: El borrado es muy eficiente cuando eliminas el último elemento. Dado que necesitas crear una variable para llevar la cuenta del último índice que contiene elementos (en el diagrama anterior, el índice 3), puedes eliminar directamente ese elemento usando el índice.

3️⃣ Encontrar un elemento

Tienes tres opciones para encontrar un elemento en un array:

  • Si sabes dónde se encuentra, utiliza el índice.
  • Si no sabes dónde se encuentra y tus datos están ordenados, puedes utilizar algoritmos para optimizar tu búsqueda, como la Búsqueda Binaria.
  • Si no sabes dónde se encuentra y tus datos no están ordenados, tendrás que buscar por cada elemento del array y comprobar si el elemento actual es el que buscas (consulta la secuencia de diagramas de abajo).

👋 En resumen…

  • Los arrays son estructuras de datos extremadamente potentes que almacenan elementos del mismo tipo. El tipo de elementos y el tamaño del array son fijos y se definen al crearlo.
  • La memoria se asigna inmediatamente después de crear el array y está vacía hasta que se asignan los valores.
  • Sus elementos se encuentran en ubicaciones contiguas de la memoria, por lo que se puede acceder a ellos de forma muy eficiente (acceso aleatorio, O(1) = tiempo constante) utilizando índices.
  • Los índices comienzan en 0, no en 1 como estamos acostumbrados.
  • Insertar elementos al principio o en medio del array implica mover elementos a la derecha. Si el array está lleno, crear un nuevo array más grande (lo que no es muy eficiente). Insertar al final del array es muy eficiente, tiempo constante O(1).
  • Eliminar elementos del principio o de la mitad del array implica mover todos los elementos a la izquierda para evitar dejar un espacio vacío en la memoria. Esto garantiza que los elementos se almacenan en espacios contiguos en la memoria. Eliminar al final del array es muy eficiente porque sólo se borra el último elemento.
  • Para encontrar un elemento, hay que revisar todo el array hasta encontrarlo. Si los datos están ordenados, puedes utilizar algoritmos como la Búsqueda Binaria para optimizar el proceso.

«Aprende del ayer, vive el hoy, espera el mañana. Lo importante es no dejar de cuestionar»
– Albert Einstein

👋 ¡Gracias!

Espero de verdad que te haya gustado mi artículo. ❤️
Seguidme en Twitter para encontrar más artículos como este. 😃

Deja una respuesta

Tu dirección de correo electrónico no será publicada.