Compensación tiempo-espacio por problema de elemento faltante

14

Aquí hay un problema bien conocido.

Dada una matriz de enteros positivos, genera el entero positivo más pequeño que no esté en la matriz.A[1n]

El problema se puede resolver en el espacio y el tiempo : lea la matriz, realice un seguimiento en el espacio O ( n ) si 1 , 2 , , n +O(n)O(n)produjo 1 , busque el elemento más pequeño.1,2,,n+1

Me di cuenta de que puedes cambiar el espacio por tiempo. Si tienes solo memoria, puede hacerlo enrondasky obtener tiempoO(kn). En un caso especial, obviamente hay un algoritmo de tiempo cuadrático de espacio constante.O(nk)kO(kn)

Mi pregunta es:

¿Es esta la compensación óptima, es decir, el ? En general, ¿cómo se prueba ese tipo de límites?timespace=Ω(n2)

Suponga el modelo RAM, con aritmética limitada y acceso aleatorio a las matrices en O (1).

Inspiración para este problema: compensación espacio-tiempo para palíndromos en el modelo de una cinta (ver, por ejemplo, aquí ).

sdcvvc
fuente
2
No, puede ordenar su matriz en luego encontrar el número faltante (el primer número debe ser 1, el segundo debe ser 2, ... de lo contrario lo encontrará) en O (n), esta clasificación podría hacerse con mergesort in situ, significa O ( 1 ) espacio adicional, por lo que el tiempo espacio pertenece a O ( n log n ) . No sé si tengo tu problema exactamente o no (debido a esto no lo respondí, tampoco sé si hay un mejor límite). O(nlogn)O(1)O(nlogn)
Supongo que la entrada es de solo lectura. (Si no es así, el problema se puede resolver de manera óptima en el espacio tiempo / O ( 1 ) : multiplique la entrada por 2 y use la paridad para simular el algoritmo O ( n ) / O ( n ) )O(n)O(1)O(n)/O(n)
sdcvvc
¿Cuál es el algoritmo de espacio constante? Parece que necesitarías un espacio de para la versión n 2 que es "obvio" para mílognn2
Xodarap
En este modelo, los enteros de tamaño de palabra toman ; Si es más conveniente, puede responder cualquier variante de la pregunta con el tiempo espacio = Ω ( n 2O(1)para alguna constantek. timespace=Ω(n2logkn)k
sdcvvc
@sdcvvc, no puedo entender tu algoritmo , ¿lo describirías un poco más? (solo tenga en cuenta que la lectura en bits toma O ( log n ) ). O(n)/O(1)O(logn)

Respuestas:

2

Esto se puede hacer en O(nlogn) operaciones de palabras y O(1) palabras de memoria (respectivamente O(nlog2n) time y O(logn) memoria en el modelo RAM a nivel de bit). De hecho, la solución se basará en la siguiente observación.

Dicen que hay n0 pares e n1 números impares en el rango [1,n+1] (de modo n0n1 y n0+n1=n+1 ). Entonces hay b{0,1} tal que hay a lo sumo nb1 valores con paridad b en la entrada. De hecho, de lo contrario hay al menos n0pares y al menos n1 valores impares en la entrada, lo que significa que hay al menos n0+n1=n+1 valores en la entrada, contradicción (solo hay n de ellos). Significa que podemos continuar buscando el número faltante solo entre los números pares o impares. El mismo algoritmo se puede aplicar a bits más altos de notación binaria también.

Entonces nuestro algoritmo se verá así:

  1. Supongamos que ya sabemos que solo hay valores de x en la entrada con el resto del módulo 2b igual a r[0,2b) pero hay al menos x+1 números en el rango [1,n+1] que tienen resto r módulo 2b (al principio sabemos que seguro para b=0,r=0 ).

  2. Digamos que hay valores x0 en la entrada con el resto r módulo 2b+1 y valores x1 en la entrada con el resto r+2b módulo 2b+1 (podemos encontrar estos números en un solo paso a través de la entrada). Claramente, x0+x1=x . Además, debido a que hay al menos x+1 números en la entrada con el resto r módulo 2b , al menos uno de los pares(r,b+1),(r+2b,b+1) satisfies the requirements of the step 1.

  3. We have found the missing number when 2bn+1: there is only one number in range [1,n+1] that may have remainder r modulo 2b (r itself if it is in range), so there are at most zero values in the input that have such remainder. So r is indeed missing.

Claramente, el algoritmo se detiene en pasos O(logn) , cada uno de ellos necesita tiempo O(n) (paso único sobre la matriz de entrada). Además, solo se requieren O(1) palabras de memoria.

Kaban-5
fuente
Estoy feliz de ver la pregunta respondida después de ese tiempo :)
sdcvvc
1

If I understand your definitions, this can be done in linear time with constant space. This is obviously the lowest bound, because we need to at least read the entire input.

The answer given in this question satisfies.

It's impossible to run this with less time or space, and adding extra time or space is useless, so there's no space-time tradeoff here. (Observe that n=O(n/k), so the tradeoff you observed doesn't hold asymptotically, in any case.)

In terms of your general question, I don't know of any nice theorems offhand which will help you prove space-time tradeoffs. This question seems to indicate that there isn't a (known) easy answer. Basically:

tsf,gLMf(t,s)g(t,s)

es desconocido, y una respuesta sólida resolvería muchos problemas abiertos (especialmente sobre SC), lo que implica que no existe una solución fácil.


nn+1

Observe that our algorithm needs to be able to differentiate between at least n possible answers. Suppose at each pass through the data we can get at most k pieces of data. Then we will need n/k passes to differentiate all answers. Assuming k=n/s then we run in nn/sn=sn time. So I think this proves what you want.

The difficulty is in showing that each time through we get only k bits. If you assume that our only legal operation is =, then we're good. However, if you allow more complex operations, then you'll be able to get more information.

Xodarap
fuente
3
The question you linked assumes that each number appears at most once. I do not make this assumption, so the solution does not apply. Thank you for second link.
sdcvvc
@sdcvvc: My mistake, I assumed you were using the version I'm familiar with. I don't have a complete answer, but it's too long for a comment - hopefully my edit is useful.
Xodarap
5
I don't buy your argument after "EDIT". Even if you can only collect k bits in a single pass, that's enough in principle to distinguish 2k possible outputs. So this argument can only imply a lower bound of n/2k passes, not n/k.
JeffE