Suponha que eu tenha uma matriz 2D M[n][n]
de números inteiros (de fato, binário é bom, mas duvido que isso importe). Estou interessado em consultas repetidas do formulário: dado um par de coordenadas, o que é
Obviamente, todos esses valores podem ser calculados no tempo total e, depois disso, as consultas recebem . No entanto, minha matriz é mutável e cada vez que altero um valor, a solução óbvia exige uma atualização .
Podemos criar uma quad-tree over M
; o pré-processamento leva, e isso nos permite fazer consultas em e atualizações em .
Minha pergunta é:
Podemos melhorar significativamente as consultas sem sacrificar muito as atualizações?
Estou especialmente interessado em obter as operações de atualização e consulta sub-lineares e, em particular, obtê-las em .
Edit: para obter mais informações, embora eu ache o problema interessante, mesmo sem essa restrição adicional, espero fazer aproximadamente consultas e sobre . O objetivo ideal é reduzir o tempo de execução completo para . Portanto, uma situação em que uma atualização usa enquanto uma consulta usa também seria interessante para mim.
fonte
Respostas:
Existe uma solução relativamente simples em que cada consulta e cada atualização podem ser feitas emO(log2n) Tempo. A estrutura de dados usaO(n2) espaço.
Nós teremoslgn "granularidades" da estrutura de dados, uma para cada potência de duas 2m de tal modo que 1≤2m≤n . A estrutura de dados para granularidade2m armazena as somas
para cadak0,l . Essa estrutura de dados para granularidade2m por sua vez, pode ser representado usando n/2m árvores balanceadas (uma para cada valor possível de k0 ) para armazenar somas de prefixo.
Agora, procure a soma do prefixo parak,l , terminamos o intervalo [0,k−1] em uma união de intervalos de potência de dois; no máximolgn intervalos são necessários. Para cada intervalo de duração2m , fazemos uma pesquisa na estrutura de dados da granularidade 2m . Assim, as perguntas podem ser respondidas fazendoO(logn) pesquisas em uma árvore equilibrada, cada uma das O(logn) tempo, por um tempo total de O(log2n) por consulta.
As atualizações também podem ser feitas emO(log2n) Tempo. AtualizarM[i,j] , para cada granularidade 2m , você atualiza a árvore balanceada apropriada na estrutura de dados de granularidade 2m . Isto éO(logn) atualizações oin O(logn) árvores equilibradas; cada um desses levaO(logn) tempo, então o tempo total é O(log2n) Tempo.
Finalmente, a estrutura de dados de granularidade2m contém n/2m árvores, cada uma ocupando O(n) espaço, portanto, o uso total do espaço é O(n2⋅(1+1/2+1/4+⋯))=O(n2) .
fonte