[알고리즘] 기타 알고리즘
Updated: Categories: CS기타 다양한 알고리즘에 대해 알아보자 (feat. 이분탐색, 탐욕법, 동적계획법, 최단경로, 최소비용)
이분탐색 (Binary Search)
- 시간복잡도 : 
O(logN) - 범위를 두 부분으로 분할하여 탐색하는 방식
 - 반드시 데이터가 정렬되어 있어야 한다
 - left, right 포인터의 중앙값인 mid를 탐색하고 포인터를 이동시킨다
 
탐욕법 (Greedy)
- 시간복잡도 : 매번다름
 - 현재의 상황에서 가장 최선의 선택을 하는 알고리즘
    
- 매순간 최선의 선택을 했을때 최적해가 나온다는 것이 보장되어 있어야 함.
 
 
동적계획법 (Dynamic Programming)
- 시간복잡도 : 매번다름
 - 문제 해결과정의 결과들을 저장하여 중복된 행위를 줄이는 알고리즘
    
- 부분 문제의 최적 결과값을 사용해 전체 문제의 최적 결과를 낼 수 있어야 함
 - 보통 dp 배열에 결과를 저장하면서 풀어낸다.
 
 - 두가지 방식을 사용한다
    
- Top-Down : 재귀를 사용하여 dp를 끝부터 채운다
 - Bottom-Up : for문을 사용하여 dp를 처음부터 채운다
 
 
그래프 - 탐색
너비우선탐색 (Breadth First Search)
- 시간복잡도 : 
O(V+E) - 큐를 사용해 구현
 - 탐색 값이 그래프 중간에 있는 경우 유리함
 
깊이우선탐색 (Depth First Search)
- 시간복잡도 : 
O(V^2) - 스택이나 재귀를 사용해 구현
 - 탐색 값이 그래프 끝에 있는 경우 유리함
 
백트래킹 (Back Tracking)
- DFS중 불필요한 경로는 가지 않고 되돌아 가는것
    
- 이를 가지치기(pruning)이라고 함
 
 
그래프 - 최단경로
다익스트라 (Dijkstra)
- 시간복잡도 : 
O(E*logV) - 하나의 시작정점이 주어질 때 다른 정점으로의 최단거리를 구하는 알고리즘
 - 음수인 가중치를 포함한다면 사용할수 없음
 - 동적계획법과 우선순위큐를 사용한 BFS로 구현한다
    
- 정점의 최소거리를 저장하는 distance 배열을 만듬
 - 초기값은 INF로 채운다
 - 현재 정점의 인접정점을 하나씩 방문큐(우선순위큐)에 넣고 거리를 배열에 업데이트한다
        
- 업데이트시 (현재 정점의 누적거리) + (인접정점까지의 거리)가 인접정점의 누적거리보다 작아야 함
 
 - 큐에서 다음 방문할 정점을 꺼내고 방문
 - 큐가 빌때까지 반복
 
 - 우선순위큐를 사용하는 이유
    
- 방문예정큐는 현재 정점과의 거리를 기준으로 오름차순 정렬함
 
 
플로이드-와샬 (Floyd-Warshall)
- 시간복잡도 : 
O(V^3) - 모든 정점에서 다른 정점으로의 최단거리를 구하는 알고리즘
 - 음수인 가중치를 포함해도 사용가능
 - 최단거리를 저장하는 2차원배열과 3중 for문으로 구현한다
    
- 최단거리 배열을 초기화한다
        
- 인접정점간 간선 가중치를 저장함.
 - 자기 자신이면 0, 인접하지 않으면 INF
 
 - 중간 방문정점 k를 모두 순회하며 시작정점 -> k -> 도착정점의 거리를 구해 업데이트한다
        
- 만약 방문하는 것이 더 효율적이라면 업데이트
 
 
 - 최단거리 배열을 초기화한다
        
 
그래프 - 최소비용신장트리 (Minimum-cost Spanning Tree)
- 가중치 무방향 그래프에서 사용됨
 - 모든 정점을 연결할때, 최소 비용으로 연결하는 모든 방법을 찾는 알고리즘
 
크루스칼 (Kruskal)
- 시간복잡도 : 정렬알고리즘에 좌우됨
 - 간선을 기준으로 트리를 구성하는 방식
 - 탐욕법과 리스트를 사용해 구현함
    
- 그래프의 모든 간선 가중치 리스트를 정렬한다
 - 가중치 리스트 순서대로 간선을 추가하며 트리를 구성한다
 - 만약 간선 추가시 사이클이 생기게 되면 이를 회피한다
        
- 사이클 발생 여부는 Union-Find 알고리즘을 통해 검사한다
 
 
 - 간선이 적을때 적합함 (정렬할게 적기때문에)
 
프림 (Prim)
- 시간복잡도 : 
O(V^2),O(E*logV)(우선순위큐 사용시) - 정점을 기준으로 트리를 구성하는 방식
 - 탐욕법과 우선순위큐를 사용해 구현함
    
- 시작 정점을 지정함 (랜덤하게 지정해도 결과는 같다)
 - 현재 정점과 인접한 정점들을 우선순위큐(가중치 우선)에 넣는다
 - 우선순위큐에서 다음 방문할 정점을 poll
        
- 만약 사이클이 만들어진다면 다음 정점을 poll
 
 - 반복
 
 - 간선이 많을때 적합함