본문 바로가기

[Algorithms]/[Theory]

(6)
[Theory] Graph 6. 최소비용 - 다익스트라(Dijkstra) 알고리즘 다익스트라(Dijkstra) 알고리즘은 하나의 시작 정점에서 끝 정점까지의 최단경로를 구하기 위한 알고리즘이다. 음의 가중치를 가지지 않으며, PriorityQueue의 사용여부에 따라 시간복잡도는 O(V^2)~O(E+VlogV)까지 나타난다. 음의 가중치를 허용하는 경우에는 벨판-포드(Bellman-Ford)알고리즘을 사용할 수 있다. (모든 정점들에 대한 최단경로를 구하는 데는 DP개념을 적용한 플로이드-워샬(Floyd-Warshall)을 사용할 수 있다.) 본론으로 돌아와서, 시작 정점이 주어졌을 때 각 정점까지의 최단경로를 구하려면 어떻게하면 될까? 다음 코드는 priorityQueue를 사용하지 않는 코드이다. import java.io.BufferedReader; import java.io.I..
[Theory] Graph 5. MST - PRIM PRIM 알고리즘은 하나의 정점에서 파생된 간선들 중에서 하나를 선택해서 MST를 만들어 가는 방식이다. 알고리즘의 동작방식은 다음과 같다. 1. 시작은 아무 정점이든 상관 없다. 2. 시작한 정점 및 인접하는 정점들 중 최소비용의 간선을 선택한다. 3. 모든 정점이 선택될 때 까지 계속 반복한다. [동작 과정] 보통 Prim의 경우, 간선들의 최소를 골라내기 위해 PriorityQueue를 사용하기도 하지만, 아래 코드에서는 이를 사용하지 않고, 코드로 그대로 나타내었다. 1. 먼저 신장트리에 연결되지 않은 정점 중에서 edge비용이 최소인 정점을 골라낸다. 2. 이어서 신장트리에 포함되지 않은 정점들 중에서 최솟값이 나오면 업데이트 한다. for(int c=0; c
[Theory] Graph 4. MST - KRUSKAL KRUSKAL 알고리즘은 간선을 하나씩 선택해서 MST(Minimun Spanning Tree) 를 찾는 과정이다. 여기서 MST(Minimum Spanning Tree)는 우리말로 '최소 신장 트리' 라고 하는데, 무향 가중치 그래프에서 신장트리를 구성하는 가중치의 합이 최소인 트리를 말한다. 더불어 신장트리(Spanning Tree)라는 것은 무향 그래프에서 n개의 정점과, n-1개의 간선으로 이루어진 트리를 말한다. 알고리즘의 동작과정을 요약하면 다음과 같다. 1. 모든 간선을 가중치에 따라 오름차순으로 정렬한다. (Sort) 2. 가중치가 낮은 간선부터 골라 트리를 만든다 ( 이때 사이클이 발생하면 다음으로 낮은 간선을 선택한다 ) 3. n-1개의 간선을 고를때 까지 반복한다. 이번엔 그림으로 살..
[Theory] Graph 3. 서로소 집합(Disjoint-set) aka, Union-Find 서로소 집합(Disjoint-set), 혹은 상호배타 집합이라고도 하는 이놈은 서로 중복 포함된 원소가 없는 집합들을 말한다. 즉, 교집합이 없다. 또한, 이렇게 분리된 집합을 구분하기 위해, 집단에 속한 하나의 특정 구분자를 정하게 되는데 이를 대표자(representative) 라 한다. 이렇게 서로소 집합을 표현하는 방법에는 연결리스트를 이용하는 방법과, 트리를 이용하는 방법이 있다. - 연결리스트 : 같은 집합의 원소들을 하나의 연결리스트로 관리해서, 대표자가 아닌 집합의 원소도 따라 들어가며 찾을 수 있다. - 트리 : 형태가 트리라고 해서, 실제로 링크를 연결해서 구현한 것은 아니고, 대표자를 나타내는 배열 한줄로 각 집합들의 대표자를 관리하고, 대표자가 같은 두 원소는 같은 집합에 있다고 생..
[Theory] Graph 2. 인접 리스트(Adjacent List) 탐색 이어서 동일한 그래프를 인접 리스트(Adjacent List)로 나타내 보도록 하자. 인접리스트로 나타내기 위해서는 노드를 구현한 클래스가 필요하다. 이 노드 클래스는 자신의 vertex 번호와, 이어지는 노드에 대한 정보를 담고 있어야 한다. - 노드 클래스 구조 static class Node{ int vertex; Node next; public Node(int vertex, Node next) { this.vertex = vertex; this.next = next; } public Node(int vertex) { this.vertex = vertex; } @Override public String toString() { return "Node [vertex=" + vertex + ", next..
[Theory] Graph 1. 인접 행렬(Adjacent Matrix) 탐색 그래프가 주어졌을때, 이를 표현하는 방법은 여러가지가 있다. 정점을 중심으로 구분하는 경우, 대표적으로 인접 행렬과, 인접 리스트 방식이 있고, 간선을 중심으로 표현하는 간선 리스트 방식이 있다. 그 중에서 인접 행렬(Adjacent Matrix)로 표현하는 방법을 간단히 정리한다. 인접 행렬(Adjacent Matrix)에서 인접( Adjacency)의 의미는, "두개의 정점(Vertex)에 간선(Edge)이 존재하면 서로 인접" 하다고 한다. 따라서 인접 행렬(Adjacent Matrix)의 구현은, VxV크기의 2차원 배열을 이용해서 간선의 정보를 저장한다. 예시) 다음과 같은 그래프가 주어졌다고 하자. 이 그래프를 Matrix상에 표현하면 아래와 같다. 간선들 사이에 방향이 없으므로, [From ..