Mostrar que as consultas de soma de intervalo em uma matriz binária não podem ser feitas usando espaço linear e tempo constante


8

Você recebe uma matriz binária de tamanho .n

Quero mostrar que nenhum algoritmo pode fazer o seguinte (ou surpreender-se e descobrir que esses algoritmos existem afinal):

1) Pré-processe a matriz de entrada usando tempo ilimitado, mas apenas usando bits .O(n)

2) Responda às consultas em tempo constante, em que a consulta solicita o número de bits definidos entre o índice xe o índice y na matriz.(x,y)xy

Parece que o tempo constante por consulta não deve permitir que o algoritmo leia informações suficientes para calcular o número de bits definidos.

Como podemos provar que esse algoritmo não existe?

Uma pergunta mais geral seria,

dado que o algoritmo pode usar o espaço , qual limite inferior no tempo de consulta podemos derivar?f(n)

Obviamente, se tivermos espaço , podemos armazenar todas as somas parciais e responder a consultas em O ( 1 ) , mas e se f for menor?f=Ω(nlogn)O(1)f


Você pode assumir que o tamanho de uma palavra na memória é e podemos ler os índices x , y em tempo constante.Θ(logn)x,y


@ EmilJeřábek - Eu quero que o algoritmo use bits (linear no tamanho da entrada), não O ( n ) palavras de memória. Isso faz sentido? O(n)O(n)
RB

2
Entendo, obrigado pelo esclarecimento. Agora, outra pergunta: quais operações você pode fazer em tempo constante com palavras de memória? Aqui está um algoritmo candidato: divida a matriz em blocos de tamanho e, para cada bloco b , armazene o conteúdo de b como uma palavra e a contagem de bits definidos antes de b como outra palavra. Isso cria O ( n ) bits. Cada consulta pode ser respondida examinando quatro palavras e pode ser calculada usando operações O ( 1 ) nessas palavras, como turnos, subtração e (mais importante) contagem de população. Seu modelo permite isso? (logn)bbbO(n)O(1)
Emil Jeřábek

@ EmilJeřábek - Eu tinha apenas operações aritméticas, indexação e pesquisas de bits (ou seja, procurando um pouco específico de uma palavra) em mente. Operações padrão de bits, como turnos, também podem ser consideradas. Concordo que, se pudermos contar o número de bits definidos em , seu algoritmo realmente resolverá o problema. O(1)
RB

O problema vem de um algoritmo que estamos construindo para consultas de soma de intervalos em janelas deslizantes. Ou seja, temos um fluxo de números inteiros, cada um em e desejamos aproximar a soma de um determinado intervalo. Nosso problema se reduz à contagem exata de intervalos em uma matriz binária (muito menor) (que também `` desliza ''). Para uma janela deslizante binária de tamanho n , usamos O ( n ) bits, adicionamos um bit no tempo constante amortizado e realizamos consultas em O ( log n ) . Eu queria saber se as consultas de tempo constante são viáveis, mesmo que a matriz não seja atualizada. 0,1,,RnO(n)O(logn)
RB

O(n)

Respostas:


6

Acredito que o que você está procurando é uma estrutura de dados compacta que suporte a operação de classificação. Vejo...

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

Especificamente, você pode modificar a solução Emils (primeira) para remover a operação de contagem pop e substituí-la por uma tabela de pesquisa (para obter detalhes, consulte o artigo da wiki). Ao reduzir o tamanho de um bloco para (log n) / 2 bits, a tabela de pesquisa usa o (n) bits.


(* facepalm *) Tabela de pesquisa, obviamente. Por que eu não pensei nisso.
Emil Jeřábek

Em vista do comentário do OP acima, é importante notar que a estrutura pode ser facilmente implementada como uma janela deslizante, de modo que mover a janela um bit (ou mesmo bloco) também leva tempo constante.
Emil Jeřábek

@ EmilJeřábek - traduzir sua solução para a janela deslizante não é fácil. Em vez de contar o número de bits definidos em toda a parte da matriz que precede o bloco atual, precisamos contar o número de bits definidos na janela deslizante que precede esse bloco, o que não parece factível em tempo constante. Estou faltando alguma coisa?
RB

xy

n

6

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

Proposição: Existem algoritmos que alcançam

  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

2

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

n{1,2,,n}ithi

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.