54. Probabilidad aplicada a algoritmos

La probabilidad permite diseñar y analizar algoritmos que usan elecciones aleatorias. Se puede estudiar el tiempo esperado, evitar entradas adversas, estimar resultados y resolver problemas donde una estrategia determinista sería costosa.

54.1 Algoritmos aleatorizados

Un algoritmo aleatorizado utiliza números aleatorios durante su ejecución. Para una misma entrada puede seguir caminos diferentes y tener distintos tiempos de ejecución o resultados intermedios.

EntradaLos datos que recibe el algoritmo.
Estado aleatorioDecisiones tomadas por azar.
SalidaRespuesta producida.
AnálisisProbabilidad de éxito o costo esperado.

54.2 Tiempo esperado

Si T es el tiempo de ejecución y puede tomar valores ti con probabilidades pi, su tiempo esperado es:

E(T)=Σ tipi

El tiempo esperado no significa que cada ejecución tarde exactamente E(T). Algunas corridas pueden ser más lentas o más rápidas.

54.3 Algoritmos Monte Carlo

Un algoritmo Monte Carlo tiene un costo acotado o controlable, pero puede producir una respuesta incorrecta con cierta probabilidad. Repitiendo el algoritmo y combinando resultados puede reducirse el error.

P(error después de k repeticiones) disminuye al crecer k

El diseño debe indicar explícitamente la probabilidad de error y cómo se calcula.

54.4 Algoritmos Las Vegas

Un algoritmo Las Vegas siempre entrega una respuesta correcta, pero su tiempo de ejecución es aleatorio. El azar afecta el camino o el costo, no la validez de la respuesta.

Las Vegas: respuesta correcta; costo aleatorio
Monte Carlo: costo controlado; posible error

La distinción ayuda a evaluar qué tipo de garantía necesita una aplicación.

54.5 Barajar una lista

El algoritmo Fisher-Yates recorre la lista y elige aleatoriamente una posición disponible para intercambiarla. Si se eligen las posiciones correctamente, cada permutación tiene la misma probabilidad.

Un barajado sesgado puede afectar juegos, muestreos y pruebas. La simulación permite comprobar si las posiciones aparecen con frecuencias parecidas.

54.6 QuickSort aleatorizado

QuickSort elige un pivote y divide los elementos menores y mayores. Elegir el pivote al azar reduce la probabilidad de caer repetidamente en divisiones muy desequilibradas:

costo esperado≈O(n log n)
peor caso determinista=O(n²)

La aleatorización protege frente a entradas especialmente desfavorables, aunque no elimina la posibilidad matemática del peor caso.

54.7 Selección aleatoria

Para seleccionar una muestra uniforme de una población grande se pueden usar índices aleatorios. Si no se permite repetir elementos, hay que actualizar el conjunto disponible o emplear un algoritmo como Fisher-Yates parcial.

Una selección con probabilidades incorrectas produce sesgo y puede invalidar las conclusiones estadísticas.

54.8 Caminata aleatoria

En una caminata aleatoria, cada paso cambia la posición según una elección probabilística. Aunque cada paso sea simple, el comportamiento acumulado puede estudiarse con esperanza, varianza y simulación.

Sn=X1+···+Xn,   Xi∈{−1,+1}

54.9 Algoritmos aleatorizados en JavaScript

Este código implementa una caminata aleatoria y devuelve la posición final:

function caminata(pasos) {
  let posicion = 0;
  for (let i = 0; i < pasos; i++) {
    posicion += Math.random() < 0.5 ? -1 : 1;
  }
  return posicion;
}

console.log(caminata(1000));

Pulsa Ejecutar para observar una posición final distinta en cada ejecución.

54.10 Laboratorio de caminata aleatoria

Simula muchas caminatas y observa la distribución de sus posiciones finales. La línea vertical marca la posición esperada, que es 0 en una caminata equilibrada.

Distribución de posiciones

Caminata aleatoriaDistribución de posiciones finales.

54.11 Complejidad amortizada y probabilidad

Algunas operaciones son costosas solo ocasionalmente. Si los costos altos aparecen con baja frecuencia, el costo promedio sobre una secuencia larga puede ser pequeño.

El análisis amortizado no siempre es una esperanza probabilística, pero ambos enfoques usan promedios para describir el comportamiento global y no una única operación.

54.12 Hashing y dispersión

Una función hash distribuye claves en posiciones. Las colisiones son inevitables cuando hay más claves posibles que posiciones, pero una buena distribución hace que el número de colisiones esperado sea bajo.

colisiones esperadas dependen de la carga y de la distribución

El análisis probabilístico ayuda a estimar el rendimiento de tablas hash.

54.13 Probabilidad y estructuras de datos

Skip lists, filtros de Bloom y estructuras de muestreo usan decisiones aleatorias para obtener operaciones rápidas o ahorrar memoria. Algunas aceptan falsos positivos, mientras que otras garantizan la respuesta y randomizan el tiempo.

54.14 Aplicaciones

Los algoritmos aleatorizados aparecen en ordenamiento, selección, criptografía, redes, muestreo, optimización, aprendizaje automático, estructuras de datos y simulación. También son útiles para evitar comportamientos sistemáticos en sistemas distribuidos.

54.15 Errores frecuentes

  • Confundir tiempo esperado con tiempo máximo.
  • Usar un generador de baja calidad en un algoritmo sensible.
  • Permitir sesgo al barajar o seleccionar muestras.
  • Confundir Monte Carlo con Las Vegas.
  • Probar una sola ejecución y sacar conclusiones sobre el promedio.
  • Olvidar especificar la probabilidad de error de un algoritmo aproximado.

54.16 Qué debes recordar y conclusión

E(T)=Σtipi
Monte Carlo: posible error, costo controlado
Las Vegas: respuesta correcta, costo aleatorio

La probabilidad aporta herramientas para diseñar algoritmos rápidos, robustos y analizables. La clave es describir con claridad qué afecta el azar: la respuesta, el tiempo, la memoria o la distribución de los casos.

Volver al índice