Una relación de orden permite comparar elementos según una jerarquía, prioridad, inclusión o magnitud. Para ser un orden parcial debe ser reflexiva, antisimétrica y transitiva.
Muchas estructuras necesitan comparar elementos: números, permisos, tareas, versiones, prioridades o subconjuntos. Las relaciones de orden permiten formalizar esas comparaciones.
No todos los órdenes se comportan igual. Algunos permiten comparar cualquier par de elementos; otros solo permiten comparar ciertos pares. Por eso distinguimos entre orden parcial y orden total.
Una relación de orden sobre un conjunto A es una relación que permite comparar elementos de A respetando ciertas propiedades.
La forma más común que estudiaremos es el orden parcial, definido por tres propiedades: reflexividad, antisimetría y transitividad.
La reflexividad indica que todo elemento está relacionado consigo mismo.
Por ejemplo, todo número es menor o igual que sí mismo: a ≤ a.
La antisimetría evita ciclos de comparación entre elementos distintos.
Por ejemplo, si a ≤ b y b ≤ a, entonces necesariamente a = b.
La transitividad permite encadenar comparaciones.
Si una tarea A debe ejecutarse antes que B, y B antes que C, entonces A debe ejecutarse antes que C.
La relación ≤ sobre los números es una relación de orden.
| Propiedad | Por qué se cumple |
|---|---|
| Reflexiva | Todo número cumple a ≤ a |
| Antisimétrica | Si a ≤ b y b ≤ a, entonces a = b |
| Transitiva | Si a ≤ b y b ≤ c, entonces a ≤ c |
La relación ⊆ entre subconjuntos también es una relación de orden.
Todo conjunto está contenido en sí mismo, la inclusión mutua implica igualdad y la inclusión puede encadenarse.
Un orden parcial permite comparar algunos pares de elementos, pero no necesariamente todos.
Con la relación de inclusión, {1} y {2} no son comparables: ninguno está contenido en el otro.
Un orden total es un orden donde cualquier par de elementos puede compararse.
La relación ≤ sobre números es un orden total porque dados dos números siempre podemos compararlos.
| Tipo de orden | Características | Ejemplo |
|---|---|---|
| Orden parcial | No todos los pares tienen que ser comparables | Inclusión entre conjuntos |
| Orden total | Todo par de elementos es comparable | ≤ sobre números |
Algunas relaciones de orden se escriben en forma no estricta, como ≤, y otras en forma estricta, como <.
| Relación | Reflexiva | Ejemplo |
|---|---|---|
| ≤ | Sí | 3 ≤ 3 |
| < | No | 3 < 3 es falso |
En este tema usamos principalmente órdenes no estrictos.
En programación, las relaciones de orden aparecen al comparar prioridades, versiones, fechas, dependencias y niveles de acceso.
Este tipo de orden permite ordenar tareas, resolver colas de prioridad o validar jerarquías.
Podemos representar una relación con pares y verificar sus propiedades.
function clave(a, b) {
return `${a}:${b}`;
}
function crearRelacion(pares) {
return new Set(pares.map(([a, b]) => clave(a, b)));
}
function esReflexiva(elementos, relacion) {
return elementos.every(a => relacion.has(clave(a, a)));
}
function esAntisimetrica(pares, relacion) {
return pares.every(([a, b]) =>
a === b || !relacion.has(clave(b, a))
);
}
function esTransitiva(pares, relacion) {
return pares.every(([a, b]) =>
pares.every(([c, d]) => {
if (b !== c) return true;
return relacion.has(clave(a, d));
})
);
}
Estas funciones reutilizan las propiedades estudiadas en el tema anterior.
function clave(a, b) {
return `${a}:${b}`;
}
function crearRelacion(pares) {
return new Set(pares.map(([a, b]) => clave(a, b)));
}
function esReflexiva(elementos, relacion) {
return elementos.every(a => relacion.has(clave(a, a)));
}
function esAntisimetrica(pares, relacion) {
return pares.every(([a, b]) =>
a === b || !relacion.has(clave(b, a))
);
}
function esTransitiva(pares, relacion) {
return pares.every(([a, b]) =>
pares.every(([c, d]) => {
if (b !== c) return true;
return relacion.has(clave(a, d));
})
);
}
const elementos = [1, 2, 3];
const paresMenorIgual = [];
for (const a of elementos) {
for (const b of elementos) {
if (a <= b) {
paresMenorIgual.push([a, b]);
}
}
}
const relacion = crearRelacion(paresMenorIgual);
console.log(esReflexiva(elementos, relacion));
console.log(esAntisimetrica(paresMenorIgual, relacion));
console.log(esTransitiva(paresMenorIgual, relacion));
Las tres salidas son verdaderas, por lo tanto la relación es un orden parcial. Además, en este caso es total.
| Área | Relación de orden | Uso |
|---|---|---|
| Prioridades | baja ≤ media ≤ alta | Ordenar tareas |
| Versiones | versión anterior ≤ versión nueva | Comparar actualizaciones |
| Permisos | lector ≤ editor ≤ administrador | Modelar jerarquías |
| Dependencias | A debe ejecutarse antes que B | Planificar procesos |
| Subconjuntos | A ⊆ B | Comparar niveles de inclusión |
Las relaciones de orden permiten modelar comparaciones, jerarquías y dependencias. Su estructura se apoya en reflexividad, antisimetría y transitividad.
En el próximo tema estudiaremos conjuntos parcialmente ordenados.