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.
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.
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.
Esta representación convierte una relación en una estructura numérica fácil de recorrer con un programa.
Supongamos los siguientes conjuntos y relación:
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 |
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. |
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.
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"));
Cuando la relación está definida sobre un mismo conjunto A, la matriz es cuadrada: tiene la misma cantidad de filas y columnas.
| R | 1 | 2 | 3 |
|---|---|---|---|
| 1 | 1 | 1 | 0 |
| 2 | 0 | 0 | 1 |
| 3 | 1 | 0 | 0 |
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.
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 |
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.