Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

범위 합계 쿼리 2D - C++에서 변경 가능

<시간/>

행렬이라는 2D 행렬이 있다고 가정하고 왼쪽 위 모서리와 오른쪽 아래 모서리에 의해 정의된 직사각형 내부 요소의 합을 계산해야 합니다.

따라서 입력이 다음과 같으면

3 0 1 4 2
5 6 3 2 1
1 2 0 1 5
4 1 0 1 7
1 0 3 0 5

따라서 합계를 찾고 값을 업데이트하는 메서드가 다음과 같이 호출됩니다.

합계 지역(2, 1, 4, 3)

업데이트(3, 2, 2)

합계 영역(2, 1, 4, 3) ,

위의 사각형(녹색)이 (2,1) 및 (4, 3)으로 정의되어 합계 =8을 포함하므로 출력은 8과 10이 됩니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 하나의 2D 배열 트리 정의

  • 하나의 2D 배열 값 정의

  • 행렬을 입력으로 받는 이니셜라이저 정의

  • n :=행렬의 행 크기

  • m :=(n이 0이 아닌 경우 0, 그렇지 않으면 행렬의 열 크기)

  • value :=n x m 크기의 2D 배열 하나 정의

  • tree :=차수의 2D 배열 하나 정의 (n + 1) x (m + 1)

  • i:=0 초기화의 경우, i − n일 때 업데이트(i를 1만큼 증가), −

    • j 초기화의 경우:=0, j

      • 업데이트(i, j, 행렬[i, j])

  • update() 함수를 정의하면 row, col, val,

    가 사용됩니다.
  • n이 0과 같거나 m이 0과 같으면 -

    • 반환

  • 델타 :=val - 값[행, 열]

  • 값[행, 열] :=발

  • i :=row + 1 초기화의 경우, i <=n일 때 i :=i + i &(-i)를 업데이트하면 −

    를 수행합니다.
    • j :=col + 1 초기화의 경우 j <=m일 때 j :=j + j &(-j) 업데이트, −

      • 트리[i, j] :=트리[i, j] + 델타

  • 함수 sum()을 정의하면 행, 열,

    이 사용됩니다.
  • ret :=0

  • 초기화 i :=행의 경우 i> 0일 때 i :=i - i &(-i)를 업데이트하려면 −

    를 수행합니다.
    • j :=col 초기화의 경우 j> 0일 때 j :=j - j &(-j)를 업데이트하려면 −

      를 수행합니다.
      • ret :=ret + 트리[i, j]

  • 리턴 렛

  • 함수 sumRegion()을 정의하면 row1, col1, row2, col2,

    가 사용됩니다.
  • m이 0과 같거나 n이 0과 같으면 -

    • 0 반환

  • (row2를 1씩 증가)

  • (row1을 1씩 증가)

  • (col1을 1씩 증가)

  • (col2를 1씩 증가)

  • return sum(row2, col2) + sum(row1 - 1, col1 - 1) - sum(row1 - 1, col2) - sum(row2, col1 - 1)

예시

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include 네임스페이스 std;class NumMatrix {public:int n, m; 벡터<벡터> 트리; 벡터<벡터> 값; NumMatrix(벡터<벡터> &matrix) { n =matrix.size(); m =!n ? 0 :행렬[0].크기(); 값 =벡터<벡터>(n, 벡터(m)); 트리 =벡터<벡터>(n + 1, 벡터(m + 1)); for (int i =0; i  0; i -=i &(-i)) { for (int j =col; j> 0; j -=j &(-j)) { ret +=tree[i ][제이]; } } 반환 ret; } int sumRegion(int row1, int col1, int row2, int col2) { if (m ==0 || n ==0) return 0; 행2++; 행1++; col1++; col2++; return sum(row2, col2) + sum(row1 - 1, col1 - 1) - sum(row1 - 1, col2) - sum(row2, col1 - 1); }};main() { 벡터<벡터> v ={ {3, 0, 1, 4, 2}, {5, 6, 3, 2, 1}, {1, 2, 0, 1, 5}, {4, 1, 0, 1, 7}, {1, 0, 3, 0, 5}}; NumMatrix ob(v); cout <<(ob.sumRegion(2, 1, 4, 3)) < 

입력

<전>벡터<벡터> v ={ {3, 0, 1, 4, 2}, {5, 6, 3, 2, 1}, {1, 2, 0, 1, 5}, { 4, 1, 0, 1, 7}, {1, 0, 3, 0, 5}}; NumMatrix ob(v); cout <<(ob.sumRegion(2, 1, 4, 3)) <

출력

810