본문 바로가기

알고리즘/주요 개념

(3)
펜윅 트리(Fenwick tree, Binary Indexed Tree) 변경되는 데이터 속에서 구간 합을 구하거나 최대/최소, 구간 곱 등을 구할 때 세그먼트 트리(링크)를 사용하였다. 하지만 세그먼트 트리는 N개의 배열이 있을 때 4*N개의 공간을 할당해야했기 때문에 많은 메모리를 필요로 하였다. 세그먼트 트리와 비슷한 역할을 하면서 N개의 공간을 사용하는 자료 구조가 있다면..? 그렇다. 그것이 바로 펜윅 트리이다. 펜윅 트리 펜윅 트리 또는 Binary Indexed Tree(BIT)라고 부른다. Binary Indexed Tree라는 이름에서 알 수 있듯이 인덱스로 이진수를 사용한다. 이것이 무슨 말이냐 하면, (그림 출처) n = 16인 위와 같은 배열이 있다고 가정하면, 각각의 수가 2진수로 나타냈을 때 어디에 마지막 1이 있는지를 알아야 한다. 1 = 0001(..
세그먼트 트리(Segment tree) {1, 3, 100, 5, -2, 10, 4, 20, 1, 5} 다음 배열의 구간 합을 m개의 각 요청마다 구한다고 생각해보자 그냥 구하게 된다면 O(mn)의 시간복잡도를 가지게 될 것이다. 이를 줄이고 싶다면, 누적합(prefix sum) 기법을 사용하면 된다. 미리 index = 0부터 더한 값들을 배열에 저장한다. pre_sum = {1, 4, 104, 109, 107, 117, 121, 141, 142, 147} 그리고 만약 i번째에서 j번째의 구간 합을 구하라는 쿼리가 들어온다면 prefix[j - 1] - prefix[i - 1]의 값을 바로 구하면 되기 때문에 O(1)의 시간복잡도 내에 각각의 쿼리를 처리할 수 있다. 이렇게 되면 처음에 누적합을 구할 때만 배열 전체를 순회하면 되기 때문에 ..
동적계획법(memoization) 동적계획법이란(Dynamic Programming)? 처음 주어진 문제를 더 작은 문제들로 나눈 뒤 각 조각의 답을 계산하고, 이 답들로부터 원래 문제에 대한 답을 계산해 내는 분할 정복의 알고리즘과 비슷하지만 동적계획법의 각 부분 문제들은 다른 답을 구하는 이용될 수 있기 때문에 계산결과를 재활용함으로써 속도의 향상을 꾀한다. 부분 문제들의 답을 재활용한다는 말이 무슨 말일까? 피보나치 수열 문제로 예를 들어보자! 동적계획법을 이용한 피보나치 수열의 풀이 https://www.acmicpc.net/problem/2748 피보나치 수열은 다들 아는 것처럼 Fn = Fn-1 + Fn-2 (n>=2)의 점화식을 가지고 전개되는 수열이다. 0 1 1 2 3 5 8 13 21 34 ..... n번째 피보나치 수..