Hay una solución que solo necesita tiempo [matemático] O (\ log k) [/ matemático] para generar un número aleatorio. Obviamente, solo tiene sentido usarlo si vas a generar muchos números aleatorios. Si desea hacerlo solo una vez, es mejor usar la solución más simple de Raziman TV: de todos modos, necesita tiempo [matemático] \ Omega (k) [/ matemático] para cualquier inicialización.
Como en la solución de Raziman TV, el número aleatorio que generaremos en nuestro algoritmo será un valor aleatorio distribuido uniformemente entre 1 y [math] nk [/ math], inclusive. Y también el valor devuelto será el mismo: el [math] (nk) [/ math] -th número válido más pequeño. Simplemente lo calcularemos de una manera más eficiente.
Usaremos la memoria [math] O (k) [/ math] para almacenar los números prohibidos [math] k [/ math] en orden ordenado . La clave es darse cuenta de que:
- ¿Cómo se puede probar que la ruta única a través de un árbol de expansión mínima entre dos nodos es una ruta más corta de "cuello de botella"?
- ¿Es posible determinar el valor máximo de puntos que se puede otorgar para una sola palabra Scrabble?
- ¿Es posible hackear usando el lenguaje de programación C?
- ¿Por qué se ejecuta un análisis de tiempo de un algoritmo llamado asintótico?
- ¿Qué alternativas hay para los algoritmos de escalada?
- los valores prohibidos [math] k [/ math] dividen los valores válidos en segmentos contiguos [math] k + 1 [/ math] (algunos de ellos posiblemente vacíos),
- podemos usar la búsqueda binaria para encontrar el segmento correcto,
- y dentro del segmento correcto podemos encontrar el valor correcto en tiempo constante.
Ejemplo: suponga que el séptimo valor prohibido más pequeño es 47. Esto significa que entre {1, …, 47} hay 40 valores válidos y 7 valores prohibidos. Si el valor aleatorio interno es 40 o menos, queremos generar un número menor que 47, y si es mayor que 40, la salida será mayor que 47.
Bonificación adicional: en lugar de una matriz ordenada, almacene los valores prohibidos en un árbol binario equilibrado. Entonces también puede agregar nuevos valores prohibidos rápidamente. Uno de los posibles usos: generar [matemática] k [/ matemática] valores aleatorios distintos de {1, …, n} en [matemática] O (k \ log k) [/ matemática] tiempo.