Hay una forma en el espacio de trabajo constante para realizar conversiones arbitrarias básicas y de tamaño arbitrario. Es decir, para convertir una secuencia de n
números en el rango [1,m]
a una secuencia de ceiling(n*log(m)/log(p))
números en el rango [1,p]
usando un mapeo de 1-a-1 que (preferiblemente pero no necesariamente) preservadores lexigraphical orden y da resultados secuenciales?Conversión de base numérica como operación de secuencia
Estoy particularmente interesado en soluciones que son viables como una función de tubería, e.i. son capaces de manejar un conjunto de datos más grande que el que se puede almacenar en la RAM.
He encontrado una serie de soluciones que requieren "espacio de trabajo" proporcional al tamaño de la entrada, pero ninguna que pueda escaparse con un "espacio de trabajo" constante.
¿Cae la diferencia secuencial? Es decir: permiten lexicográfico entradas secuenciales que dan lugar a las salidas no lexicográfico secuenciales:
F(1,2,6,4,3,7,8) -> (5,6,3,2,1,3,5,2,4,3)
F(1,2,6,4,3,7,9) -> (5,6,3,2,1,3,5,2,4,5)
algunas reflexiones:
podría funcionar esto?
StreamBase n -> convert (
n
,lcm(n,p)
) -> convert (lcm(n,p)
,p
) -> StreamBase p
(donde lcm
es mínimo común múltiplo)
No creo que pueda descartar el segundo término en la suma, porque floor (a + b) ≠ piso (a) + piso (b) en general. Si el primer término es solo una pequeña fracción menor que un entero, el valor del segundo término es muy significativo. –
Creo que (erróneamente) he indicado las condiciones para seleccionar z. Conceptualmente, lo que trato de hacer es usar un rango para el número entrante 'a'. A medida que obtenemos cada dígito, el rango que 'a' puede ser reducido. Una vez que es lo suficientemente estrecha, podemos saber con certeza (en cualquier base que nos gusta) cuál es la secuencia inicial (es decir, si estamos convirtiendo 0x4b a decimal, incluso faltando los dos últimos dígitos, sabemos que los primeros dígitos decimales son 19, ya que el número solo puede estar entre 19200 y 19455. Volveré a examinar lo que hice y veré si puedo expresarlo correctamente en una edición. – Wuggy
Este proceso me recuerda a la descompresión aritmética (¿decodificación de rango?) - que podría ser suficiente para mostrar que cualquier flujo se puede dividir en dígitos de manera única. Creo que hay un caso patológico donde no se puede generar el siguiente dígito hasta que haya visto toda la transmisión entrante. – caffiend