I was trying to find maximum element of any sub matrix AXB from a matrix NXM. I implemented sparse tree method. But I was unable to optimise this. Actually I need to solve range queries, so I need to optimize the code. On doing pre-computation, for any N,M values it takes O(NMlog(N)log(M)) time complexity. How can I improve this to (N*M). Here is my code for precomputation
for(int i=0; i<n;i++)
for(int j=0; j<m;j++)
cin>>arr[i][j];
for(int i=0; pow(2,i) <= n; i++)
for(int j=0; pow(2,j) <= m; j++)
for(int x=0; x + pow(2,i)-1 < n; x++)
for(int y = 0; y + pow(2,j) -1 < m; y++)
{
i=(int)i;
j=(int)j;
if (i == 0 && j == 0)
M[x][y][i][j] = arr[x][y];
else if (i == 0)
M[x][y][i][j] = maxi(2,M[x][y][i][j-1], M[x][(int)(y+pow(2,(j-1)))][i][j-1]);
else if (j == 0)
M[x][y][i][j] = maxi(2,M[x][y][i-1][j], M[(int)(x+ pow(2,(i-1)))][y][i-1][j]);
else
M[x][y][i][j] = maxi(4,M[x][y][i-1][j-1], M[(int)(x + pow(2,(i-1)))][y][i-1][j-1], M[x][(int)(y+pow(2,(j-1)))][i-1][j-1], M[(int)(x + pow(2,(i-1)))][(int)(y+pow(2,(j-1)))][i-1][j-1]);
}
For input x,y,x1,y1
k = log(x1 - x + 1);
l = log(y1 - y + 1);
int max_element = max(4,M[x][y][k][l], M[(int)(x1 - pow(2,k) + 1)][y][k][l], M[x][(int)(y1 - pow(2,l) + 1)][k][l], M[(int)(x1 - pow(2,k) + 1)][(int)(y1 - pow(2,l) + 1)][k][l]);
How can Improve performance of this code. Please help.
Aucun commentaire:
Enregistrer un commentaire