3. Objetos discretos y objetos continuos

Elegir entre un modelo discreto y uno continuo cambia la forma de representar datos, diseñar algoritmos y evaluar resultados. Esta distinción permite convertir fenómenos reales en información que una computadora puede procesar.

3.1 Introducción

Antes de resolver un problema con software debemos decidir qué objetos vamos a representar. Esa decisión no es solo técnica: determina qué valores son válidos, qué operaciones tienen sentido y qué precisión puede alcanzar nuestro programa.

La distinción básica es entre objetos discretos, que se presentan como elementos separados, y objetos continuos, que pueden variar sin saltos dentro de un intervalo. La matemática discreta se concentra en los primeros, mientras que el cálculo y otras ramas de la matemática continua se especializan en los segundos.

3.2 ¿Qué es un objeto discreto?

Un objeto discreto pertenece a un conjunto cuyos elementos pueden diferenciarse individualmente. A menudo podemos contarlos o enumerarlos, al menos en principio. Los números naturales, los caracteres de un texto, los vértices de un grafo y los registros de una base de datos son ejemplos típicos.

Cantidad de mensajes enviados hoy: 0, 1, 2, 3, ...
Estado de una orden: "pendiente", "pagada" o "enviada"
Índices de un arreglo de 5 elementos: 0, 1, 2, 3, 4
Letras de una contraseña: elementos de un alfabeto finito

Entre dos estados de una orden no existe un estado intermedio válido, y entre los índices 3 y 4 no hay otro índice entero. Esa separación es la característica que hace discreto al modelo.

3.3 ¿Qué es un objeto continuo?

Un objeto continuo puede tomar infinitos valores dentro de cualquier intervalo, por pequeño que sea. Los números reales son el modelo habitual: entre 2 y 3 están 2,5; 2,75; 2,999 y también infinitos valores más.

Magnitudes físicas como la distancia, el tiempo, la masa, la temperatura y la velocidad suelen comenzar con un modelo continuo. Por ejemplo, una persona puede recorrer 1,2 metros, 1,23 metros o 1,234567 metros, dependiendo de la precisión con que midamos.

Intervalo [0, 1]: 0,1; 0,01; 0,001; 0,0001; ...

No hay un «siguiente número real» después de 0,1.
Siempre puede encontrarse otro número entre dos reales distintos.

3.4 Comparación fundamental

CaracterísticaDiscretoContinuo
ValoresSeparados e identificablesSin saltos dentro de un intervalo
Ejemplo matemáticoNúmeros enterosNúmeros reales
Pregunta habitual¿Cuántos? ¿Cuál es el siguiente?¿Qué valor? ¿Cómo cambia?
Herramientas frecuentesConteo, grafos, lógica, recurrenciasLímites, derivadas, integrales
Ejemplo de softwareUsuarios, archivos, estados, caracteresMedición de un sensor o posición física

Un problema puede tener aspectos de ambos tipos. Un videojuego tiene una cantidad discreta de objetos y eventos, pero puede modelar posiciones y velocidades mediante números que aproximan variables continuas.

3.5 Los números naturales y los enteros

Los números naturales 0, 1, 2, 3, ... son un ejemplo central de conjunto discreto. Se usan para contar elementos, numerar posiciones y definir repeticiones. Los enteros agregan valores negativos y permiten modelar diferencias, saldos o desplazamientos.

const productosEnCarrito = 3;
const cambioDeStock = -2;

console.log(`Productos en el carrito: ${productosEnCarrito}`);
console.log(`Cambio de stock: ${cambioDeStock}`);

En ambos casos los valores representan cantidades que cambian por unidades. No tendría sentido tener 2,4 productos indivisibles en un carrito si el dominio del problema establece que cada producto se cuenta como una unidad.

3.6 Conjuntos finitos e infinitos numerables

Muchos objetos discretos forman conjuntos finitos: los días de la semana, las opciones de un menú o los bits de un byte. Otros conjuntos discretos son infinitos, como los números naturales, pero sus elementos pueden enumerarse ordenadamente.

ConjuntoTipoEjemplo de uso
{true, false}FinitoVariable booleana
{0, 1, ..., 255}FinitoValor de un byte sin signo
N = {0, 1, 2, ...}Infinito numerableÍndices teóricos de una secuencia
Conjunto de todas las cadenas finitasInfinito numerableEntradas posibles de un programa

En una computadora real la memoria es limitada, por lo que toda estructura almacenada tiene tamaño finito. Sin embargo, los modelos infinitos son útiles para razonar sobre algoritmos para entradas de cualquier tamaño.

3.7 La computadora trabaja con representaciones finitas

Una computadora no puede almacenar todos los números reales ni medir con precisión infinita. Para procesar una magnitud continua utiliza una representación finita: una cantidad determinada de bits, una unidad de medida y una regla de aproximación.

Por ejemplo, una interfaz puede guardar una posición en píxeles enteros, o en coordenadas con decimales. En ambos casos el conjunto de valores realmente representables es finito dentro de la memoria disponible.

Fenómeno: temperatura ambiente aparentemente continua.
Medición: 22,37 °C con dos decimales.
Dato almacenado: un valor finito que aproxima la medición.

3.8 Cuantización: convertir valores continuos en niveles

La cuantización asigna cada valor de un rango continuo a uno de un conjunto finito de niveles. Es una operación indispensable en imágenes digitales, audio, sensores y controles de interfaz.

Si un sensor entrega una temperatura y la pantalla solo muestra números enteros, podemos redondear la medición. El resultado es discreto aunque la temperatura original se modele como continua.

function nivelDeTemperatura(temperatura) {
  return Math.round(temperatura);
}

console.log(nivelDeTemperatura(22.37)); // 22
console.log(nivelDeTemperatura(22.68)); // 23

Cuantizar simplifica el almacenamiento y el procesamiento, pero introduce un error de aproximación. La elección de la cantidad de niveles depende de cuánta precisión necesita la aplicación.

3.9 Muestreo: convertir una señal en una secuencia

Una señal continua, como una onda sonora, se transforma en datos digitales tomando mediciones en instantes separados. Cada medición es una muestra y la colección de muestras es una secuencia discreta.

Señal continua: volumen del sonido en cada instante.
Muestreo: medir el volumen cada cierto intervalo de tiempo.
Resultado: [0.12, 0.18, 0.21, 0.19, ...]

La frecuencia de muestreo determina cuántas mediciones se toman por segundo. Tomar pocas muestras puede perder detalles importantes; tomar demasiadas aumenta el espacio necesario y el trabajo de procesamiento.

3.10 Píxeles: una imagen continua representada en una grilla

Una fotografía de una escena real puede parecer continua, pero una imagen digital se almacena como una grilla de píxeles. Cada píxel tiene una posición discreta y un color representado con valores numéricos finitos.

const imagen = [
  [0, 128, 255],
  [64, 192, 32]
];

console.log(`Píxel de fila 1, columna 2: ${imagen[0][1]}`);
console.log(`Cantidad de filas: ${imagen.length}`);

En este ejemplo cada número representa intensidad de gris entre 0 y 255. La escena puede variar de forma continua, pero el archivo contiene una cantidad finita de posiciones y niveles de color.

3.11 Tiempo continuo y tiempo discreto

El tiempo físico suele modelarse como continuo. Sin embargo, los programas lo manejan mediante instantes discretos: milisegundos, fotogramas, turnos de un juego o eventos registrados por un servidor.

Una simulación puede actualizarse 60 veces por segundo. Entre dos actualizaciones, el programa no evalúa todos los instantes posibles; calcula un nuevo estado a partir del estado anterior y de un intervalo de tiempo elegido.

function actualizarPosicion(posicion, velocidad, segundos) {
  return posicion + velocidad * segundos;
}

const siguientePosicion = actualizarPosicion(10, 3, 1 / 60);
console.log(siguientePosicion); // 10.05

El valor calcula una aproximación de la posición después de un fotograma. Cuanto menor sea el intervalo, mejor puede aproximarse un cambio continuo, aunque el costo computacional también aumenta.

3.12 Estados discretos

Muchos sistemas se describen mejor mediante un conjunto finito de estados. Una orden no está «un poco pagada» desde el punto de vista de su flujo principal: puede estar pendiente, pagada, enviada, entregada o cancelada. Las transiciones válidas también forman parte del modelo.

const transiciones = {
  pendiente: ["pagada", "cancelada"],
  pagada: ["enviada", "cancelada"],
  enviada: ["entregada"],
  entregada: [],
  cancelada: []
};

function puedeCambiarA(estadoActual, nuevoEstado) {
  return transiciones[estadoActual].includes(nuevoEstado);
}

console.log(puedeCambiarA("pendiente", "pagada")); // true
console.log(puedeCambiarA("entregada", "enviada")); // false

Este tipo de representación aparece en interfaces, protocolos de red, procesos de negocio, videojuegos y autómatas. El modelo discreto hace visibles las transiciones que deben permitirse y las que deben rechazarse.

3.13 Precisión de punto flotante

En JavaScript, la mayoría de los números se representan con punto flotante binario. Algunos decimales que parecen simples en base 10 no pueden representarse exactamente en esa forma, por lo que determinadas operaciones muestran pequeñas diferencias de redondeo.

const resultado = 0.1 + 0.2;

console.log(resultado); // 0.30000000000000004
console.log(resultado === 0.3); // false
console.log(Math.abs(resultado - 0.3) < 1e-10); // true

No es un error de JavaScript en particular, sino una consecuencia de la representación finita. Para comparaciones de valores aproximados se usa una tolerancia. Para dinero, suele ser preferible almacenar unidades enteras mínimas, como centavos.

3.14 Elegir unidades discretas

Una estrategia frecuente consiste en elegir una unidad suficientemente pequeña y trabajar solo con enteros. Por ejemplo, en lugar de guardar $19,99 como un número decimal, podemos almacenar 1999 centavos. Así evitamos errores de redondeo al sumar importes.

const precioEnCentavos = 1999;
const cantidad = 3;
const totalEnCentavos = precioEnCentavos * cantidad;

console.log(`Total: $${(totalEnCentavos / 100).toFixed(2)}`); // $59.97

La unidad elegida depende del problema. Para una tienda pueden ser centavos; para un temporizador, milisegundos; para una imagen, píxeles. El objetivo es lograr precisión suficiente con una representación manejable.

3.15 Cómo elegir el modelo adecuado

No existe una única respuesta correcta para todos los problemas. Debemos analizar qué se necesita preservar y qué nivel de detalle exige la aplicación.

  1. Identificar el fenómeno o la entidad que se desea representar.
  2. Decidir si los valores posibles son unidades separadas o magnitudes sin saltos.
  3. Elegir una unidad, precisión o conjunto de estados.
  4. Considerar los errores de aproximación y los límites de memoria.
  5. Verificar que las operaciones del programa respeten el modelo elegido.
Cantidad de alumnos: entero discreto.
Altura de un alumno: magnitud continua aproximada con decimales.
Estado de inscripción: valor discreto de un conjunto de opciones.

3.16 Errores frecuentes

  • Usar números decimales para dinero sin considerar el redondeo de punto flotante.
  • Tratar una cantidad de objetos indivisibles como si pudiera tomar cualquier valor real.
  • Elegir una precisión demasiado baja y perder información importante.
  • Elegir una precisión excesiva que aumenta el almacenamiento y no aporta valor.
  • Suponer que una variable con decimales representa exactamente una magnitud continua.
  • No definir los estados válidos ni las transiciones permitidas de un proceso.

3.17 Qué debes recordar de este tema

  • Los objetos discretos se presentan como elementos separados; los continuos pueden tomar infinitos valores entre dos valores distintos.
  • Las computadoras almacenan representaciones finitas, incluso cuando modelan fenómenos continuos.
  • El muestreo transforma señales continuas en secuencias y la cuantización las asigna a niveles finitos.
  • Los estados, índices, caracteres y registros son ejemplos naturalmente discretos.
  • Las representaciones de punto flotante pueden introducir pequeños errores de aproximación.
  • Elegir la unidad y precisión correctas es parte del diseño de un programa.

3.18 Conclusión

La diferencia entre lo discreto y lo continuo permite decidir cómo traducir un problema del mundo real a datos y operaciones de software. Un buen modelo conserva lo importante, hace explícitas sus limitaciones y permite construir algoritmos correctos.

En el próximo tema comenzaremos a estudiar técnicas de demostración matemática, que nos permitirán justificar formalmente que una afirmación o un algoritmo es válido.