logo

Summert arealtabell - Submatrisesummasjon

Gitt en matrise med størrelse M x N er det et stort antall spørringer for å finne submatrisesummer. Inndata til spørringer er venstre øverste og høyre nederste indekser av submatrise hvis sum er å finne ut. 

Hvordan forbehandle matrisen slik at submatrise sum spørringer kan utføres i O(1) tid. 

Eksempel:



  tli :   Row number of top left of query submatrix   tlj :   Column number of top left of query submatrix   rbi :   Row number of bottom right of query submatrix   rbj :   Column number of bottom right of query submatrix Input: mat[M][N] = {{1 2 3 4 6} {5 3 8 1 2} {4 6 7 5 5} {2 4 8 9 4} }; Query1: tli = 0 tlj = 0 rbi = 1 rbj = 1 Query2: tli = 2 tlj = 2 rbi = 3 rbj = 4 Query3: tli = 1 tlj = 2 rbi = 3 rbj = 3; Output: Query1: 11 // Sum between (0 0) and (1 1) Query2: 38 // Sum between (2 2) and (3 4) Query3: 38 // Sum between (1 2) and (3 3)

Naiv algoritme:  

Vi kan sløyfe alle spørringene og beregne hver spørring i O (q*(N*M)) verste fall, som er for stort for et stort tallområde.

// Pseudo code of Naive algorithm. Arr[][] = input_matrix For each query: Input tli tlj rbi rbj sum = 0 for i from tli to tbi (inclusive): for j from tlj to rbj(inclusive): sum += Arr[i][j] print(sum) 

Optimalisert løsning: 

Oppsummert arealtabell kan redusere denne typen spørring til forbehandlingstid på O(M*N), og hver spørring vil kjøres i O(1). Summed Area Table er en datastruktur og algoritme for raskt og effektivt å generere summen av verdier i et rektangulært delsett av et rutenett. 

Verdien på et hvilket som helst punkt (x y) i den summerte arealtabellen er bare summen av alle verdiene over og til venstre for (x y) inklusive:

  ' title= 

Den optimaliserte løsningen er implementert i innlegget nedenfor.

  Implementering av optimalisert tilnærming  

Lag quiz