[세호/week6] 그래프의 개념과 정의, 탐색 방법
그래프 그래프는 유한하고, 하나 이상의 원소를 갖는 Vertex 집합과 Vertex의 부분집합의 순서있는 쌍으로 이루어진 Edge의 집합으로 이루어진다. Edge는 Vertex의 쌍 (v1, v2)와 같이 나타내고, 방향그래프에서 순서는 유의미하다 헷갈리는 그래프 관련 ...
그래프는 유한하고, 하나 이상의 원소를 갖는
Vertex 집합과
Vertex의 부분집합의 순서있는 쌍으로 이루어진Edge의 집합
으로 이루어진다. Edge는 Vertex의 쌍 (v1, v2)와 같이 나타내고, 방향그래프에서 순서는 유의미하다
Adjacent
: 두 Vertex 간의 edge가 존재하는 것
Reachable
: 두 Vertex 간의 path가 존재하는 것
Connected
: Undirected Graph에서 임의의(모든) 두 node간 path가 존재하는 것
Strongly Connected
: Digraph에서 임의의 두 node간 path가 존재하는 것
Symmetric Digraph
: 임의의 정점 Vi, Vj에 대해서 (Vi, Vj)가 존재할때 (Vj, Vi)도 존재하는 것
Conneted Component
: 최대 연결 서브그래프 (Maximal connected subgraph)
</br>
그래프를 컴퓨터에서 표현하는 방법은 두 가지가 있다.
첫번째는 인접 행렬(Adjacency Matrix)
이고, 두번째는 인접 리스트(Adjacency List)
이다.
## 인접행렬의 구현
인접행렬은 2차원 배열을 이용해 두 정점간 edge가 존재하는 경우 1, 존재하지 않는 경우 0으로 나타 내면된다.
### 인접행렬의 장단점
인접행렬은 두 정점이 인접한지 여부를 O(1)의 복잡도로 찾을 수 있으나,
연결되지 않은 edge가 많은 경우 공간 낭비가 많다.
## 인접리스트의 구현 Vector의 배열을 이용해 구현한다.
std::vector<int> adj_list[SIZE]; // 벡터의 배열
위와 같이 벡터의 배열을 선언하고, 0번 정점에서 2번 정점으로 edge가 존재하는 경우
adj_list[0].push_back(2)
위와 같이 원소를 추가하면 된다.
### 인접리스트의 장단점
인접리스트는 인접한 경우에만 원소를 가지기 때문에 필요한 공간만 차지한다는 장점이 있으나,
두 정점이 인접하는지 여부를 찾기위해 최악의 경우 O(V)의 시간 복잡도가 필요하다.
깊이 우선 탐색(DFS)는 시작 정점으로부터 거리가 먼 정점부터 방문하는 순회 방법이다.
## DFS의 구현
DFS는 스택(Stack)
을 이용해 구현할 수 있다.
1. Stack이 빌때까지 아래 과정을 반복한다.
2. (처음) 방문하는 노드를 스택에 넣는다.
3. 방문한 노드에서 갈 수 있는 다른 노드가 있는 경우, 그 노드를 방문한다.
이때, 한번 방문한 노드는 표시해둔다.
4. 방문한 노드에서 이미 모두 방문했거나, 더이상 갈 곳이 없는 경우, 스택에서 Pop한 후, Top인 노드로 Back tracking 한다.
너비 우선 탐색(BFS)는 시작 정점으로부터 가까이에 있는 정점부터 방문하는 순회 방법이다.
## BFS의 구현
BFS는 큐(Queue)
를 이용해 구현할 수 있다.
1. Queue 가 빌떄까지 아래 과정을 반복한다.
2. 방문하는 노드에서 인접한 모든 정점을 큐에 넣는다.
3. Queue의 front를 방문하고 Queue에서 삭제한다.
그래프 그래프는 유한하고, 하나 이상의 원소를 갖는 Vertex 집합과 Vertex의 부분집합의 순서있는 쌍으로 이루어진 Edge의 집합으로 이루어진다. Edge는 Vertex의 쌍 (v1, v2)와 같이 나타내고, 방향그래프에서 순서는 유의미하다 헷갈리는 그래프 관련 ...
그래프(Graph)의 개념 단순히 노드(N, node)와 그 노드를 연결하는 간선(E, edge)을 하나로 모아 놓은 자료 구조
트리의 개념
트리의 구현과 순회
자료구조란? 자료구조(data structure)는 전산학에서 자료를 효율적으로 이용할 수 있도록 컴퓨터에 저장하는 방법이다. 신중히 선택한 자료구조는 보다 효율적인 알고리즘을 사용할 수 있게 한다.
동적 계획법
동적 계획법 - Dynamic Programming ; DP
분할 정복이란 문제를 둘 이상의 부분으로 나누어, 부분 문제에 대한 답을 재귀 호출을 이용해 계산하는 알고리즘 디자인. 분할 정복을 적용하기 위해서는 .. 문제를 둘 이상의 부분 문제로 나누는 자연스러운 방법이 있어야하고 부분 분제의 답을 조...
분할 정복(Divide and Conquer)이란?
분할 정복 이란? 분할정복 알고리즘은 문제를 나눌 수 없을 떄까지 나누어서 각각을 풀면서 다시 합병하여 문제의 답은 얻는 알고리즘이다.
분할정복이란
모든 경우에 있어서 항상 우월한 성능을 보이는 자료구조와 알고리즘은 없다. 그래서 자료구조와 알고리즘을 분석하고 평가할 수 있어야 한다.
Algorithm Study Week1 일자 : 2019년 10월 7일 월요일 Member : 이세호, 김범철, 이지연, 이지혜 “프로그래밍 대회에서 배우는 알고리즘 문제 해결 전략” 2, 3, 4장 키워드 : 시간복잡도와 Big-O 표기 Algospot 튜토리...
Algorithm Study Week1 일자 : 2019년 10월 7일 월요일 Member : 이세호, 김범철, 이지연, 이지혜 “프로그래밍 대회에서 배우는 알고리즘 문제 해결 전략” 2, 3, 4장 키워드 : 시간복잡도와 Big-O 표기 Algospot 튜토리...