[자료구조] 세그먼트 트리(Segment Tree)
·
CS/자료구조
0. 세그먼트 트리(Segment Tree)란?세그먼트 트리(Segment Tree)어떤 데이터가 주어질 때, 특정 구간의 결과값(구간합, 최댓값 등)을 구하는데 사용하는 자료구조세그먼트 트리는 이진 트리(Binary Tree) 구조를 가지고 있으며, 특정 구간의 결과값을 시간복잡도 O(logN)으로 빠르게 구할 수 있다는 장점이 있다.또한, 자료의 수정이 빈번히 일어날 때, 사용한다. 이 게시글에서는 누적합을 구하는 세그먼트 트리 기준으로 설명을 한다.만약 구간 최대나 구간 최소를 알고 싶다면, 반환하는 부분만 수정하면 된다.1. 세그먼트 트리 알아보기1-1. 세그먼트 트리 생성(초기화)아래는 [5, 7, 6, 3, 1, 9]인 원본 배열로부터 만든 세그먼트 트리이다.파란 글씨는 해당 노드가 가리키는 ..
[알고리즘] 모든 쌍 최단 경로: 플로이드 워셜(Floyd-Warshall) 알고리즘
·
CS/알고리즘
0. 최단 경로최단 경로간선의 가중치가 있는 그래프에서 두 정점 사이의 경로들 중에 간선의 가중치의 합이 최소인 경로하나의 시작 정점에서 끝 정점까지의 최단 경로다익스트라(Dijkstra) 알고리즘음의 가중치를 허용하지 않음벨만-포드(Bellman-Ford) 알고리즘음의 가중치 허용모든 정점들에 대한 최단 경로플로이드-워셜(Floyd-Warshall) 알고리즘이번에는 이 중에서 플로이드-워셜(Floyd-Warshall) 알고리즘을 알아본다.1. 플로이드-워셜(Floyd-Warshall) 알고리즘모든 정점에서 다른 모든 정점으로의 최단 경로를 구하는 알고리즘이다.시작 정점에서 목표 정점의 최단 경로를 계산할 때, 다른 정점을 경유했을 때 비용을 비교하면서 구하는 방식이다.DP 기법을 사용한 알고리즘으로 인..
[알고리즘] 최장 증가 부분 수열 LIS(Longest Increasing Subsequence)
·
CS/알고리즘
0. 최장 증가 부분 수열 LIS최장 증가 부분 수열 LIS어떤 수열이 왼쪽에서 오른쪽으로 나열되어 있을 때, 그 배열 순서를 유지하면서 크기가 점진적으로 커지는 가장 긴 부분 수열을 추출하는 문제를 의미한다.ex) 3, 2, 6, 4, 5, 1의 배열의 LIS 해 중 하나는 2, 4, 5이다.이 문제를 부분집합으로 접근하면 시간 복잡도가 O(2^n)이므로, DP나 이진 검색을 활용하여 접근하는 것이 효율적이다.1. DP를 활용한 접근각 원소까지의 LIS 길이를 저장하는 배열인 LIS라고 할 때, LIS(i)를 이전 단계들과의 관계로 표현해보자.Case 1: LIS(i)가 a_i를 부분 수열의 마지막으로 포함하지 않는다면 → LIS(i) = LIS(i - 1)Case 2: LIS(i)가 a_i를 부분 수..
[자료구조] 트라이(Trie)
·
CS/자료구조
0. 트라이(Trie)트라이(Trie)는 문자열을 저장하고 호율적으로 탐색하기 위한 트리 형태의 자료구조이다. 트라이는 Retrieval Tree에서 나온 단어로 검색할 때 사용되는 자동완성 기능, 사전 검색 등 문자열 탐색에 특화되어 있다.단, 각 노드에서 자식들에 대한 배열을 모두 저장하고 있다는 점에서 저장 공간의 크기가 크다.(메모리 복잡도에서 비효율적임)0-1. 트라이 자료구조의 노드 구조트라이의 노드는 4개의 정보를 담고 있다.key: 현재 노드의 알파벳data: 현재 노드까지의 결과 -> 완성된 문자열endOfWord: 현재 노드로 이루어진 단어가 있는지 판단하는 변수children: 자식 알파벳 노드들1. 트라이(Trie) 연산1-1. 삽입첫번째 문자가 trie head의 자식 노드에 있는..