반응형

펜윅 트리(Fenwick Tree) == BIT(Binary Indexed Tree)

- 구간합을 구할 때 log(n)정도의 복잡도를 가지고 있다.


구현을 하기 위해서는 입력받은 값의 2진수에서 처음 1이 나오는 곳의 값을 알아야 한다.

예를 들어서 5의 2진수는 101 이고 처음 1이 나오는 곳의 값은 1이다.

또 다른 예.

3 == 11    -> 1

4 == 100   -> 4

7 == 111   -> 1

12 == 1100-> 4

이렇게 N개를 받은 배열을 A[N]이라고 치면 L[N]은 A의 원소들마다 처음 1이 나오는 곳의 값이다.

또, Tree[i]는 A[i] 부터 앞으로 L[i]개의 합을 저장해놓았다.


L[i]를 구하기 위해서는 아래의 공식이 적용된다.

L[i] = (i & -i);

왜냐하면, 아래의 예시를 보자.

      -num = ~num + 1
       num = 100110101110101100000000000
      ~num = 011001010001010011111111111
      -num = 011001010001010100000000000
num & -num = 000000000000000100000000000

~num은 num의 1의 보수고, +1한게 2의 보수인데 AND를 했을 때 처음 1이 나오는 곳의 값을 얻을 수 있다.


그럼 Tree배열을 사용해서 어떻게 구간합을 구하냐면, 앞서 말했듯이 Tree배열은 A[i]부터 앞으로 L[i]개의 합을 저장해놓았다.

Tree[i]     = A[i] + A[i + 1] + ... + A[i + L[i] - 1]

Tree[i - k - 1] =A[i - k - 1] + A[i - k] + ... + A[i - k - 1 + L[i] - 1]

Tree[i] - Tree[i - k - 1] =  A[i - k] + A[i - k + 1] + ... + A[i + L[i] - 1]

즉, i까지 합 - (k - 1)까지 합 = k부터 i까지의 합 이기때문에 빼주기만 하면 된다.

'Programming > 자료구조' 카테고리의 다른 글

퀵소팅(Quick sorting)  (0) 2015.12.07
버블 소팅(Bubble Sorting)  (0) 2015.08.06
블로그 이미지

KuroNeko_

KuroNeko

,