Soma de prefixo na matriz 2D mutável

8

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 coordenadask,eu, 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 .

i=0k1j=0l1M[i][j]?
O(n2)O(1)O(n2)

Podemos criar uma quad-tree over M; o pré-processamento levaO(n2log(n)), e isso nos permite fazer consultas em e atualizações em .O(nlog(n))O(log(n))

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 .O(nϵ)

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.O(n3)O(n2)O(n3+ϵ)O(nlog(n))O(log(n))

Mees de Vries
fonte
11
Com uma árvore Fenwick 2D (também conhecida como árvore BIT), você pode obter atualizações e consultas em O(registron)Tempo. Há uma página que descreve aqui: geeksforgeeks.org/… . Disclaimer: Eu não entendi completamente como isso funciona.
Jrandom_hacker

Respostas:

3

Existe uma solução relativamente simples em que cada consulta e cada atualização podem ser feitas em O(log2n)Tempo. A estrutura de dados usaO(n2) espaço.

Nós teremos lgn "granularidades" da estrutura de dados, uma para cada potência de duas 2m de tal modo que 12mn. A estrutura de dados para granularidade2m armazena as somas

i=k02m(k0+1)2m1j=0l1M[i,j]

para cada k0,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 para k,l, terminamos o intervalo [0,k1]em uma união de intervalos de potência de dois; no máximolgnintervalos 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 em O(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 granularidade 2m 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).

DW
fonte