Mostrar que las consultas de suma de intervalo en una matriz binaria no se pueden hacer usando espacio lineal y tiempo constante

8

Se le da una matriz binaria de tamaño .n

Quiero mostrar que ningún algoritmo puede hacer lo siguiente (o sorprenderse y descubrir que estos algoritmos existen después de todo):

1) Preprocese la matriz de entrada con tiempo ilimitado, pero solo con bits .O(n)

2) Responda consultas en tiempo constante, donde la consulta solicita el número de bits establecidos entre el índice x y el índice y en la matriz.(x,y)xy

Parece que el tiempo constante por consulta no debería permitir que el algoritmo lea suficiente información para calcular el número de bits establecidos.

¿Cómo podemos demostrar que no existe tal algoritmo?

Una pregunta más general sería:

dado que el algoritmo puede usar el espacio , ¿qué límite inferior en el tiempo de consulta podemos derivar?f(n)

Obviamente, si tenemos un espacio podemos almacenar todas las sumas parciales y responder consultas en O ( 1 ) , pero ¿y si f es más pequeño?f=Ω(nlogn)O(1)f


Puede suponer que el tamaño de una palabra de memoria es y podemos leer los índices x , y en tiempo constante.Θ(logn)x,y

RB
fuente
@ EmilJeřábek - Quiero que el algoritmo use bits (lineales en el tamaño de entrada), no palabras de memoria O ( n ) . ¿Tiene sentido? O(n)O(n)
RB
2
Ya veo, gracias por la aclaración. Ahora, otra pregunta: ¿qué operaciones puedes hacer en tiempo constante en palabras de memoria? Aquí hay un algoritmo candidato: dividir la matriz en bloques de tamaño , y para cada bloque b , almacenar el contenido de b como una palabra, y el recuento de bits establecidos antes de b como otra palabra. Esto hace O ( n ) bits. Cada consulta se puede responder mediante el examen de cuatro palabras, y se puede calcular utilizando operaciones O ( 1 ) en estas palabras, tales como turnos, sustracción y (lo más importante) recuento de población. ¿Su modelo permite esto? (logn)bbbO(n)O(1)
Emil Jeřábek
@ EmilJeřábek - Solo tenía en mente operaciones aritméticas, indexación y búsquedas de bits (es decir, buscar un bit específico de una palabra). También se pueden considerar operaciones de bits estándar, como los desplazamientos Estoy de acuerdo en que si pudiéramos contar el número de bits establecidos en , su algoritmo realmente resuelve el problema. O(1)
RB
El problema proviene de un algoritmo que estamos creando para consultas de suma de intervalos sobre ventanas deslizantes. Es decir, tenemos una secuencia de enteros, cada uno en y deseamos aproximar la suma de un intervalo dado. Nuestro problema se reduce al recuento exacto de intervalos en una matriz binaria (mucho más pequeña) (que también se `` desliza ''). Para una ventana deslizante binaria de tamaño n , utilizamos O ( n ) bits, agregamos un bit en tiempo constante amortizado y realizamos consultas en O ( log n ) . Me preguntaba si las consultas de tiempo constante son factibles, incluso si la matriz no se actualiza. 0,1,,RnO(n)O(logn)
RB
@ EmilJeřábek: ¡gracias por su sugerencia y análisis! Esta puede ser una respuesta a la pregunta, a pesar de que no responde completamente a nuestras necesidades. El espacio de bits es una restricción difícil para nosotros, y deseamos demostrar que ningún algoritmo puede responder consultas en tiempo constante. O(n)
RB

Respuestas:

6

Creo que lo que está buscando es una estructura de datos compacta que respalde la operación de clasificación. Ver...

https://en.m.wikipedia.org/wiki/Succinct_data_structure

Específicamente, puede modificar la solución Emils (primera) para eliminar la operación de conteo emergente y reemplazarla con una tabla de búsqueda (para más detalles, consulte el artículo wiki). Al reducir el tamaño de un bloque a (log n) / 2 bits, la tabla de búsqueda utiliza o (n) bits.

Benjamin Sach
fuente
(* facepalm *) Tabla de búsqueda, obviamente. ¿Por qué no pensé en eso?
Emil Jeřábek
En vista del comentario del OP anterior, vale la pena señalar que la estructura se puede implementar fácilmente como una ventana deslizante, por lo que mover la ventana un bit (o incluso bloquear) también lleva tiempo constante.
Emil Jeřábek
@ EmilJeřábek: traducir su solución a la configuración de la ventana deslizante no es sencillo. En lugar de contar el número de bits establecidos en toda la parte de la matriz que precede al bloque actual, necesitamos contar el número de bits establecidos dentro de la ventana deslizante que precede a este bloque, que no parece factible en un tiempo constante. ¿Me estoy perdiendo algo?
RB
xy
n
6

lognlog2nlog(k)nloglogk timesnlognO~(t(n))O(t(n)polylog(t(n)))

Propuesta: Hay algoritmos que logran

  1. O(nlog(k)n)O(1)k

  2. O(n)O~(logn)

k>0n=b0>b1>>bk>0nb0b1b2kbi2

  • i=1,,ki(i1)

  • kkxy

bi

ni=1klogbi1bi,
O(k+bk).

kbi=log(i)n0<i<kbk=1

k=logn

bi=i(logi)3log(i)n.
ni=1klog(i)n+2logii(logi)3log(i)nni=13i(logi)2=cn
c
Emil Jeřábek
fuente
2

O(n)n(1+o(1))

n{1,2,,n}ithi

RB
fuente