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=0k−1∑j=0l−1M[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))


11
Com uma árvore Fenwick 2D (também conhecida como árvore BIT), você pode obter atualizações e consultas em O(registro⁡n)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(log2⁡n)Tempo. A estrutura de dados usaO(n2) espaço.

Nós teremos lg⁡n "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

∑i=k0⋅2m(k0+1)⋅2m−1∑j=0l−1M[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,k−1]em uma união de intervalos de potência de dois; no máximolg⁡nintervalos 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(log⁡n) pesquisas em uma árvore equilibrada, cada uma das O(log⁡n) tempo, por um tempo total de O(log2⁡n) por consulta.

As atualizações também podem ser feitas em O(log2⁡n)Tempo. AtualizarM[i,j], para cada granularidade 2m, você atualiza a árvore balanceada apropriada na estrutura de dados de granularidade 2m. Isto éO(log⁡n) atualizações oin O(log⁡n)árvores equilibradas; cada um desses levaO(log⁡n) tempo, então o tempo total é O(log2⁡n) 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).

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.