알고리즘/Algorithm Theory
-
삼분 탐색(Ternary Search)알고리즘/Algorithm Theory 2025. 1. 30. 19:08
삼분 탐색어떤 unimodal한 그래프에서, 최대/최소 값을 O(logN)에 찾는 알고리즘 unimodal은 단조 증가와 단조 감소로 이분되는 그래프로 아래 그림과 같다.이런 값들의 나열에 대해서 삼분 탐색을 가능하고, 만약 같은 값이 연속되는 평평한 구간이 존재하는 경우 사용 불가능하다. 삼분 탐색 알고리즘 과정1. unimodal한 구간에 대해 삼분 탐색을 수행2. 구간을 3개로 나누어서 탐색, [O, A], [A, B], [B, N]3. f(A)가 f(B)보다 크다면, [O, A]에는 최솟값이 존재할 수 없으므로, 구간을 [A, N]으로 축소4. 2 ~ 3 과정을 반복5. 남은 구간3개의 후보 값에 대해 완전 탐색 이분 탐색과 과정은 비슷한데, 3개의 구간에 대해 탐색 영역을 줄여나가면서 진행..
-
회전하는 캘리퍼스(Rotating Calipers)알고리즘/Algorithm Theory 2025. 1. 29. 04:09
개요한동안 바빠서 새 알고리즘을 공부할 틈이 없었는데, 연휴 기념 오랫만에 들고온 기하 알고리즘 ~아래 내용은 CCW와 Convex Hull에 대한 이해를 바탕으로 한다.CCW: https://doraeul19.tistory.com/297Convex Hull: https://doraeul19.tistory.com/343 회전하는 캘리퍼스(Rotating Calipers)캘리퍼스는 아래와 같이 길이를 측정하는 도구로, 회전하는 캘리퍼스 알고리즘은 볼록 다각형을 돌면서 두 지점간의 거리를 구하는 알고리즘이다. 지지선과 대척점지지선(A line of support): 볼록 다각형에 대해 점이나 변에 접한 직선 대척점(Anti podal points): 평행한 두 지지선이 있을 때, 그 지지선에 닿아있..
-
Trie 트라이알고리즘/Algorithm Theory 2024. 12. 21. 03:00
어떤 문자열이 어떤 문자열들의 집합에 속하는지 알아내기 위해 단순히 모두 비교할 경우O(문자열의 길이 x 문자열의 개수) 의 시간 복잡도를 가진다. 이 때 문자열을 효율적으로 저장하고 탐색하는 자료 구조가 Trie이다. 대충 O(N) 그냥 그림을 보면 이해가 쉽다. 아래와 같이 4개의 단어가 있다고 해보자. Trie 자료 구조에 각 단어를 담아보면 아래와 같다. 트라이 자료구조는 주어진 문자열에 대해 앞 문자부터 하나씩 노드를 생성하면서 만들어진다. Insert1. 문자열에서 현재 문자를 확인2. 현재 문자로 이루어진 노드가 존재한다면 → 그 노드를 탐색존재하지 않는다면 → 새 노드를 생성 Find1. 문자열에서 현재 문자를 확인2. 자식 노드가 현재 문자인 노드가 있는지 확인, 없다면 return..
-
체비쇼프 거리알고리즘/Algorithm Theory 2024. 3. 24. 19:44
체비쇼프 거리 Chebyshev Distance 유클리드 거리와, 맨허튼 거리 외에도 체비쇼프 거리라는 것이 있다. 솔직히 특별한 거리는 아니고, 맨허튼 거리가 8 방향에 대해 적용되는 것이라고 보면된다. 노랑색 칸 부터 다른 칸들에 대해 체비쇼프 거리를 나타내면 다음과 같다. Flood Fill(BFS) 를 8 방향으로 돌려 얻거나, 격자의 좌표의 차이의 최대 값이 거리가 된다. strcut yx{ int y, x }; yx a, b; int distance = max(abs(a.x - b.x), abs(a.y - b.y)); https://www.acmicpc.net/problem/28452(체비쇼프 거리를 활용한 시뮬레이션 문제) 28452번: 탄막 게임 두 점 $A(x_1, y_1)$과 $B(x_..
-
라빈-카프, 접미사 배열, lcp 배열알고리즘/Algorithm Theory 2024. 3. 24. 04:40
- Hash(string to int) https://blog.joonas.io/143 문자열을 정수로 해싱하기 + 사전순 비교까지 (String to unique integer hashing) 문자열을 정수로?이 글에서 다루는 내용은, 문자열의 형태로 적혀있는 "112223"과 같은 문자열을 말하는 것이 아닙니다. 영어 소문자로만 이루어진 "aaabbb" 또는 대문자로만 이루어진 "ABCCDD" 같은 blog.joonas.io - RabinKarp https://junstar92.tistory.com/125 Rabin-karp(라빈 카프) 알고리즘 두번째로 살펴볼 문자열 탐색 알고리즘은 Rabin-Karp 입니다. 라빈카프 알고리즘은 해싱(Hashing)을 사용해서 문자열에서 특정 패턴과 일치하는지 찾..
-
세그먼트 트리 (Segment Tree)알고리즘/Algorithm Theory 2024. 3. 12. 13:48
- 일반적인 구간 합 계산 int arr[5] = {3, 2, 1, 5, 4}; arr에서의 2번째에서 4번째까지의 합 : 2 + 1 + 5 = 8 배열의 길이가 N 일 때, 일반적인 구간 합 계산으로는 O(N)의 시간 복잡도를 가진다. 만약 N의 길이가 조금만 커져도 해당 연산을 반복하게 되면, 매우 오랜 시간을 필요로 하게 된다.. 해당 경우, 세그먼트 트리를 사용하여, O(logN)의 시간 복잡도로 구간 합을 구할 수 있다. - 세그먼트 트리 해당 배열을 세그먼트 트리로 나타내면 아래와 같다. 트리는 노드는 9 개, 높이는 3인 이진트리 형태를 가진다. 루트 노드 : 총 합(전체 배열의 합) 리프 노드 : 배열의 각 원소 값 트리의 높이 : math.ceil(log2(N)) //ceil은 올림 함수..
-
[Algorithm] MST, Minimun Spanning Tree알고리즘/Algorithm Theory 2024. 2. 21. 10:38
- MST : 그래프의 모든 정점을 연결하는 최소 비용 트리 1) Kruskal 크루스칼 - 간선들을 가중치를 기준으로 오름차순 정렬 - 사이클이 생기지 않는 간선을 (정점의 개수 - 1) 개 만큼 뽑아냄 2) Prim 프림 - 최소 힙을 사용하여, 각 정점으로 부터 최소 간선을 선택해나감 - 크루스칼 알고리즘 - 크루스칼 구현 #include #include #include using namespace std; int N = 5; struct Node { int a, b; int price; }; vector line; int arr[10]; bool compare(Node t, Node v) { return t.price < v.price; } void Init() { for (int i = 0; i..