본문 바로가기
반응형
[C++로 배우는 알고리즘과 자료구조 심화] Day 28: 시뮬레이티드 어닐링 (Simulated Annealing) 시뮬레이티드 어닐링 (Simulated Annealing)시뮬레이티드 어닐링(Simulated Annealing, SA)은 금속의 냉각 및 결정화 과정에서 영감을 받은 확률적 최적화 알고리즘입니다. 이 알고리즘은 전역 최적해를 찾기 위해 국부 최적해에서 탈출할 수 있도록 고안되었습니다.시뮬레이티드 어닐링의 주요 단계초기화: 초기 해와 초기 온도를 설정합니다.이웃 해 생성: 현재 해의 이웃 해를 무작위로 생성합니다.해 수용: 새로운 해가 더 나은 해이면 수용합니다. 그렇지 않으면, 확률적으로 수용합니다.온도 감소: 온도를 점진적으로 낮춥니다.종료 조건 확인: 종료 조건(예: 온도가 충분히 낮아지거나 최대 반복 횟수에 도달)을 확인합니다.문제 예시: 여행하는 외판원 문제 (TSP)시뮬레이티드 어닐링을 사용하.. 2024. 8. 1.
[C++로 배우는 알고리즘과 자료구조] Day 25: 다익스트라 알고리즘 (Dijkstra's Algorithm) 다익스트라 알고리즘 (Dijkstra's Algorithm)다익스트라 알고리즘은 가중치가 있는 그래프에서 단일 출발점으로부터 다른 모든 정점까지의 최단 경로를 찾는 알고리즘입니다. 이 알고리즘은 음수 가중치가 없는 그래프에서 작동합니다.다익스트라 알고리즘의 시간 복잡도:일반적인 구현: (O(V^2))우선순위 큐를 사용한 구현 (힙): (O((V + E) \log V))다익스트라 알고리즘 구현그래프 구현 (인접 리스트 사용)#include #include #include #include #include // 그래프 클래스 정의class Graph {public: Graph(int vertices); void addEdge(int u, int v, int weight); // 간선 추가 vo.. 2024. 8. 1.
[C++로 배우는 알고리즘과 자료구조 심화] Day 25: 임의화 알고리즘 (Randomized Algorithms) 임의화 알고리즘 (Randomized Algorithms)임의화 알고리즘은 무작위성을 도입하여 문제를 해결하는 알고리즘입니다. 이러한 알고리즘은 일반적으로 평균적인 성능이 좋으며, 특정 패턴이나 최악의 경우를 피할 수 있습니다. 대표적인 임의화 알고리즘에는 랜덤 선택 알고리즘 (Randomized Selection Algorithm), 랜덤 탐색 알고리즘 (Randomized Search Algorithm) 등이 있습니다.랜덤 선택 알고리즘 (Randomized Selection Algorithm)랜덤 선택 알고리즘은 주어진 배열에서 k번째 작은 원소를 찾는 문제를 해결합니다. 이 알고리즘은 퀵 선택(Quickselect) 알고리즘의 변형으로, 피벗을 무작위로 선택하여 평균적인 성능을 향상시킵니다.문제 .. 2024. 8. 1.
[C++로 배우는 알고리즘과 자료구조] Day 26: 플로이드-워셜 알고리즘 (Floyd-Warshall Algorithm) 플로이드-워셜 알고리즘 (Floyd-Warshall Algorithm)플로이드-워셜 알고리즘은 모든 정점 쌍 간의 최단 경로를 찾는 알고리즘입니다. 이 알고리즘은 음의 가중치가 있는 그래프에서도 작동하지만, 음의 사이클이 있는 그래프에서는 사용할 수 없습니다.플로이드-워셜 알고리즘의 시간 복잡도:(O(V^3)), 여기서 (V)는 정점의 수입니다.플로이드-워셜 알고리즘 구현그래프 구현 (인접 행렬 사용)#include #include #include // 무한대 값을 나타내는 상수const int INF = INT_MAX;// 그래프 클래스 정의class Graph {public: Graph(int vertices); void addEdge(int u, int v, int weight); // .. 2024. 8. 1.
[C++로 배우는 알고리즘과 자료구조 심화] Day 26: 선형 계획법 (Linear Programming) 선형 계획법 (Linear Programming)선형 계획법은 주어진 선형 제약 조건하에서 선형 목표 함수를 최적화(최대화 또는 최소화)하는 문제를 해결하는 기법입니다. 선형 계획법은 경제학, 운영 연구, 엔지니어링 등 다양한 분야에서 사용됩니다. 가장 널리 알려진 방법은 단체법 (Simplex Method)과 내부 점 방법 (Interior Point Method)입니다.선형 계획법 문제 정의일반적인 선형 계획법 문제는 다음과 같이 정의됩니다:[\begin{aligned}& \text{Maximize (or Minimize)} \quad & c^T x \& \text{subject to} \quad & Ax \leq b \& & x \geq 0\end{aligned}]여기서 (c)는 목표 함수의 계수 .. 2024. 8. 1.
[C++로 배우는 알고리즘과 자료구조] Day 23: 깊이 우선 탐색 (DFS) 깊이 우선 탐색 (DFS, Depth-First Search)깊이 우선 탐색(DFS)은 그래프 탐색 알고리즘 중 하나로, 가능한 한 깊게 탐색한 후 더 이상 깊이 갈 수 없으면 다시 되돌아와 다른 경로를 탐색하는 방식입니다. DFS는 스택 자료구조를 사용하여 구현할 수 있으며, 재귀적으로도 구현이 가능합니다.DFS의 주요 특징:시간 복잡도: (O(V + E)), 여기서 (V)는 정점의 수, (E)는 간선의 수입니다.공간 복잡도: (O(V)), 재귀 호출 스택의 깊이입니다.DFS 구현그래프 구현 (인접 리스트 사용)#include #include #include // 그래프 클래스 정의class Graph {public: Graph(int vertices); void addEdge(int v, .. 2024. 8. 1.
[C++로 배우는 알고리즘과 자료구조 심화] Day 23: 분할 상환 분석 (Amortized Analysis) 분할 상환 분석 (Amortized Analysis)분할 상환 분석은 알고리즘의 시간 복잡도를 분석하는 기법으로, 개별 연산의 최악의 경우 시간 복잡도가 아닌, 일련의 연산에 대한 평균 시간 복잡도를 계산하는 방법입니다. 이는 데이터 구조의 연산이 불균등하게 발생할 때 매우 유용합니다. 분할 상환 분석의 주요 기법에는 Aggregate Analysis, Accounting Method, Potential Method가 있습니다.Aggregate AnalysisAggregate Analysis는 전체 연산에 대해 총 비용을 계산하고, 이를 연산 수로 나누어 평균 비용을 구하는 방법입니다.Accounting MethodAccounting Method는 각 연산에 대해 가상의 "크레딧"을 할당하여 연산 비용을.. 2024. 8. 1.
[C++로 배우는 알고리즘과 자료구조] Day 24: 너비 우선 탐색 (BFS) 너비 우선 탐색 (BFS, Breadth-First Search)너비 우선 탐색(BFS)은 그래프 탐색 알고리즘 중 하나로, 시작 정점에서 출발하여 인접한 정점들을 모두 탐색한 후, 탐색이 끝난 정점의 인접 정점을 탐색하는 방식입니다. BFS는 큐 자료구조를 사용하여 구현할 수 있습니다.BFS의 주요 특징:시간 복잡도: (O(V + E)), 여기서 (V)는 정점의 수, (E)는 간선의 수입니다.공간 복잡도: (O(V)), 큐와 방문 여부를 저장하는 배열의 크기입니다.BFS 구현그래프 구현 (인접 리스트 사용)#include #include #include #include // 그래프 클래스 정의class Graph {public: Graph(int vertices); void addEdge(i.. 2024. 8. 1.
[C++로 배우는 알고리즘과 자료구조 심화] Day 24: 확률적 알고리즘 (Monte Carlo, Las Vegas 알고리즘) 확률적 알고리즘확률적 알고리즘은 무작위성을 도입하여 문제를 해결하는 알고리즘입니다. 이러한 알고리즘은 일반적으로 평균적인 성능이 좋으며, 최악의 경우를 피할 수 있습니다. 확률적 알고리즘은 크게 두 가지 유형으로 나눌 수 있습니다: Monte Carlo 알고리즘과 Las Vegas 알고리즘.Monte Carlo 알고리즘Monte Carlo 알고리즘은 정해진 시간 내에 정답을 찾을 확률을 높이는 알고리즘입니다. 정확한 답을 보장하지 않지만, 답을 찾을 확률이 높습니다.예시: 소수 판별Monte Carlo 알고리즘을 사용하여 주어진 수가 소수인지 판별하는 방법입니다. 주로 Miller-Rabin 소수 판별법이 사용됩니다. Monte Carlo 알고리즘 구현: Miller-Rabin 소수 판별법#include.. 2024. 8. 1.
[C++로 배우는 알고리즘과 자료구조 심화] Day 21: 문자열 동적 계획법 (Edit Distance, Longest Common Subsequence) 문자열 동적 계획법문자열 관련 문제는 많은 응용 분야에서 중요합니다. 오늘은 두 가지 주요 문제인 편집 거리(Edit Distance)와 최장 공통 부분 수열(Longest Common Subsequence, LCS)에 대해 학습하겠습니다.편집 거리 (Edit Distance)편집 거리(Edit Distance)는 두 문자열을 같게 만들기 위해 필요한 최소 편집 연산 횟수를 의미합니다. 가능한 편집 연산은 삽입, 삭제, 교체입니다.문제 정의두 문자열 ( s1 )과 ( s2 )가 주어졌을 때, ( s1 )을 ( s2 )로 변환하는 데 필요한 최소 편집 연산 횟수를 계산합니다.편집 거리 구현다음은 C++로 편집 거리 문제를 해결하는 예제입니다.#include #include #include #include .. 2024. 8. 1.
반응형