8. Representación matricial de relaciones

Una matriz de relación usa filas, columnas, ceros y unos para indicar qué pares pertenecen a una relación. Es una representación útil para cálculos, algoritmos y análisis de conexiones.

8.1 Introducción

Cuando una relación tiene muchos pares, listarlos uno por uno puede volverse incómodo. Una alternativa es usar una matriz, donde cada fila representa un elemento de origen y cada columna representa un elemento de destino.

En esa matriz escribimos 1 si el par pertenece a la relación y 0 si no pertenece.

8.2 Idea general

Si tenemos una relación R de un conjunto A en un conjunto B, la matriz tendrá tantas filas como elementos tenga A y tantas columnas como elementos tenga B.

M[i][j] = 1 si (A[i], B[j]) pertenece a R M[i][j] = 0 si (A[i], B[j]) no pertenece a R

Esta representación convierte una relación en una estructura numérica fácil de recorrer con un programa.

8.3 Ejemplo con usuarios y permisos

Supongamos los siguientes conjuntos y relación:

Usuarios = {Ana, Luis, Marta} Permisos = {leer, editar, eliminar} R = { (Ana, leer), (Ana, editar), (Luis, leer), (Marta, eliminar) }

La matriz se arma colocando usuarios en filas y permisos en columnas.

Usuario / Permiso leer editar eliminar
Ana 1 1 0
Luis 1 0 0
Marta 0 0 1

8.4 Lectura de una matriz de relación

Para leer una matriz, buscamos la fila del elemento de origen y la columna del elemento de destino. El valor de esa celda indica si el par pertenece a la relación.

Consulta Celda Valor Interpretación
¿Ana puede editar? Fila Ana, columna editar 1 Sí, el par pertenece a la relación.
¿Luis puede eliminar? Fila Luis, columna eliminar 0 No, el par no pertenece a la relación.
¿Marta puede eliminar? Fila Marta, columna eliminar 1 Sí, el par pertenece a la relación.

8.5 Construir la matriz en JavaScript

Podemos construir una matriz binaria a partir de los conjuntos de origen, destino y la lista de pares de la relación.

const usuarios = ["Ana", "Luis", "Marta"];
const permisos = ["leer", "editar", "eliminar"];

const relacion = [
  ["Ana", "leer"],
  ["Ana", "editar"],
  ["Luis", "leer"],
  ["Marta", "eliminar"]
];

const matriz = usuarios.map(usuario =>
  permisos.map(permiso =>
    relacion.some(([u, p]) => u === usuario && p === permiso) ? 1 : 0
  )
);

console.log(matriz);

Cada fila de la matriz corresponde a un usuario y cada columna corresponde a un permiso.

8.6 Consultar una matriz

Para consultar una matriz, necesitamos conocer el índice de la fila y el índice de la columna. Esos índices se obtienen buscando la posición de los elementos en sus conjuntos.

const usuarios = ["Ana", "Luis", "Marta"];
const permisos = ["leer", "editar", "eliminar"];
const matriz = [
  [1, 1, 0],
  [1, 0, 0],
  [0, 0, 1]
];

function existeRelacion(origen, destino) {
  const fila = usuarios.indexOf(origen);
  const columna = permisos.indexOf(destino);

  if (fila === -1 || columna === -1) {
    return false;
  }

  return matriz[fila][columna] === 1;
}

console.log(existeRelacion("Ana", "editar"));
console.log(existeRelacion("Luis", "eliminar"));

8.7 Relación sobre un mismo conjunto

Cuando la relación está definida sobre un mismo conjunto A, la matriz es cuadrada: tiene la misma cantidad de filas y columnas.

A = {1, 2, 3} R = {(1, 1), (1, 2), (2, 3), (3, 1)}
R 1 2 3
1 1 1 0
2 0 0 1
3 1 0 0

8.8 Matriz y pares ordenados

También podemos hacer el proceso inverso: convertir una matriz en una lista de pares ordenados.

const A = [1, 2, 3];
const matriz = [
  [1, 1, 0],
  [0, 0, 1],
  [1, 0, 0]
];

const pares = [];

for (let i = 0; i < A.length; i++) {
  for (let j = 0; j < A.length; j++) {
    if (matriz[i][j] === 1) {
      pares.push([A[i], A[j]]);
    }
  }
}

console.log(pares);

Cada celda con valor 1 se transforma en un par ordenado.

8.9 Ventajas de la representación matricial

  • Permite consultar rápidamente si un par pertenece a la relación.
  • Facilita operaciones sistemáticas sobre todas las combinaciones.
  • Es útil para relaciones sobre conjuntos finitos.
  • Se adapta bien a algoritmos que trabajan con grafos y conectividad.
  • Permite detectar patrones visuales en relaciones pequeñas.

8.10 Límites de la representación matricial

La matriz puede ocupar mucho espacio cuando los conjuntos son grandes. Si hay pocos vínculos reales, una lista de pares puede ser más conveniente.

Situación Representación conveniente
Pocos vínculos entre muchos elementos Lista de pares ordenados
Muchos vínculos y consultas frecuentes Matriz
Necesidad de visualizar caminos Grafo dirigido
Datos tabulares de negocio Tabla de base de datos

8.11 Qué debes recordar de este tema

  • Una matriz de relación usa 1 para indicar que un par pertenece a la relación y 0 para indicar que no pertenece.
  • Las filas representan elementos de origen y las columnas representan elementos de destino.
  • Una relación sobre un mismo conjunto se representa con una matriz cuadrada.
  • La matriz puede convertirse en lista de pares y la lista de pares puede convertirse en matriz.
  • La representación matricial es útil para cálculos, consultas y algoritmos sobre relaciones finitas.

8.12 Conclusión

La representación matricial transforma una relación discreta en una estructura ordenada de ceros y unos. Esto facilita consultas, cálculos y análisis computacional.

En el próximo tema estudiaremos la representación mediante grafos dirigidos, que permite visualizar relaciones como nodos conectados por flechas.