Kun matriisi, jonka koko on M x N, on suuri määrä kyselyitä alimatriisisumman löytämiseksi. Kyselyjen syötteet ovat alimatriisin vasemman ylä- ja oikean alaosan indeksejä, joiden summa on selvitettävä.
Kuinka esikäsitellä matriisi niin, että alimatriisin summakyselyt voidaan suorittaa O(1)-ajassa.
Esimerkki:
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) Naiivi algoritmi:
Voimme tehdä silmukan kaikki kyselyt ja laskea jokaisen kyselyn O (q*(N*M)) pahimmassa tapauksessa, joka on liian suuri suurelle lukualueelle.
// 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)
Optimoitu ratkaisu:
Pinta-alan yhteenlaskettu taulukko voi lyhentää tämäntyyppisen kyselyn esikäsittelyaikaan O(M*N) ja jokainen kysely suoritetaan O(1):ssä. Sumd Area Table on tietorakenne ja algoritmi arvojen summan luomiseen nopeasti ja tehokkaasti ruudukon suorakaiteen muotoiseen osajoukkoon.
Arvo missä tahansa pisteessä (x y) summattu pinta-alataulukossa on vain kaikkien (x y) yläpuolella ja sen vasemmalla puolella olevien arvojen summa mukaan lukien:
Optimoitu ratkaisu on toteutettu alla olevassa viestissä.
Optimoidun lähestymistavan käyttöönotto
Luo tietokilpailu