que-es-jagged-array-array-dentado

¿Qué es un Jagged Array?

  • 5 min

Un Jagger Array, también conocido como matriz jagged o matriz irregular, es una estructura de datos multidimensional en la que cada fila puede tener un número diferente de elementos.

Cuando aprendemos a usar arrays multidimensionales, casi siempre empezamos imaginando una cuadrícula perfecta: una hoja de cálculo de Excel donde todas las filas tienen el mismo número de columnas. Esto es lo que llamamos una Matriz rectangular.

Pero la vida real no siempre es tan ordenada. A veces necesitamos agrupar datos donde cada grupo tiene un tamaño distinto. Aquí es donde entra el Jagged Array.

programacion-jagged-array

Internamente, un Jagged Array es, literalmente, un array de arrays. Es una colección donde cada elemento es, a su vez, otro array que puede tener su propia longitud independiente.

La diferencia visual y lógica

Para entenderlo, comparemos una Matriz (2D) con un Jagged Array:

  • Matriz Rectangular (int[,]): Es un bloque sólido. Si declaras una matriz de , tienes 9 celdas. Si la fila 1 solo necesita 2 datos, desperdicias la tercera celda.
  • Jagged Array (int[][]): Es flexible. La fila 0 puede tener 5 elementos, la fila 1 puede tener 2, y la fila 2 puede tener 100.

Visualmente, si los alineamos a la izquierda, el borde derecho queda “dentado” (jagged), de ahí su nombre.

  1. Ahorro de Memoria (si los datos son irregulares): Si tienes una estructura triangular (ej. fila 1 tiene 1 dato, fila 2 tiene 2…), usar una matriz rectangular te obligaría a reservar espacio para el caso más grande, llenando el resto de ceros inútiles. El Jagged Array solo ocupa lo justo.
  2. Flexibilidad: Puedes intercambiar filas enteras simplemente cambiando una referencia, sin copiar todos los datos.
// Intercambiar fila 0 y 1 es instantáneo
var temp = jagged[0];
jagged[0] = jagged[1];
jagged[1] = temp;
Copied!
  1. Rendimiento (Cache Misses): Al no estar los datos juntos en memoria, el procesador no puede predecir bien qué dato vendrá después, lo que provoca más fallos de caché. Para álgebra lineal intensiva, es más lento que una matriz rectangular.
  2. Complejidad de instanciación: Tienes que crear el array principal y luego instanciar cada uno de los subarrays (un bucle de new).

¿Cómo funciona en la memoria?

Aunque conceptualmente puede parecer parecido (o no) la diferencia en cómo implementarlo en memoria es enorme. La diferencia en la gestión de memoria es abismal.

Los datos suelen guardarse en un único bloque contiguo de memoria. El ordenador calcula la posición con una fórmula matemática:

ó

Es muy rápido y eficiente para la caché del procesador.

No hay un bloque único, las filas pueden estar dispersas por toda la memoria RAM.

Tienes un Array principal que contiene referencias

Cada referencia apunta a otro array que está en algún lugar de la memoria

Cada uno de estos Arrays secundarios, tienen los datos reales

Para leer un dato, el procesador tiene que hacer dos viajes: primero buscar la referencia del array fila, y luego buscar el dato dentro de esa fila.

Sintaxis de jagged arrays en distintos lenguajes

Aunque el concepto es universal, la sintaxis varía según el lenguaje. A continuación, veremos ejemplos en varios lenguajes populares.

En C#, los jagged arrays se implementan como arreglos de arreglos.

using System;

class Program
{
    static void Main()
    {
        // Declarar un jagged array con 3 filas
        int[][] jaggedArray = new int[3][];

        // Inicializar cada fila con un subarreglo de diferente longitud
        jaggedArray[0] = new int[] { 1, 2, 3 };
        jaggedArray[1] = new int[] { 4, 5 };
        jaggedArray[2] = new int[] { 6 };

        // Acceder a los elementos
        Console.WriteLine(jaggedArray[1][0]);  // Salida: 4
    }
}
Copied!

En .NET, el Jagged Array ([][]) suele ser, paradójicamente, más rápido que la Matriz ([,]) para operaciones simples debido a optimizaciones específicas del CLR (Common Language Runtime), a menos que uses unsafe pointers.

Pero en C++, una matriz plana siempre gana en velocidad bruta.

En Java, los jagged arrays se implementan como arreglos de arreglos.

public class Main {
    public static void main(String[] args) {
        // Declarar un jagged array con 3 filas
        int[][] jaggedArray = new int[3][];

        // Inicializar cada fila con un subarreglo de diferente longitud
        jaggedArray[0] = new int[] { 1, 2, 3 };
        jaggedArray[1] = new int[] { 4, 5 };
        jaggedArray[2] = new int[] { 6 };

        // Acceder a los elementos
        System.out.println(jaggedArray[1][0]);  // Salida: 4
    }
}
Copied!

En Python, los jagged arrays se implementan como listas de listas.

# Declarar un jagged array con 3 filas
jagged_array = [
    [1, 2, 3],
    [4, 5],
    [6]
]

# Acceder a los elementos
print(jagged_array[1][0])  # Salida: 4
Copied!

En JavaScript, los jagged arrays se implementan como arreglos de arreglos.

// Declarar un jagged array con 3 filas
const jaggedArray = [
    [1, 2, 3],
    [4, 5],
    [6]
];

// Acceder a los elementos
console.log(jaggedArray[1][0]);  // Salida: 4
Copied!

En JavaScript, técnicamente no existen las matrices rectangulares reales a nivel de estructura de datos básica. Cuando creas un int[][] en Java, siempre es un Jagged Array por debajo, aunque tú lo inicialices cuadrado.