네번째 자료구조 포스팅은 그래프이다!
그래프를 구성하는 요소는 두가지 이다.
그래프는 정점(vertex)과 간선(edge)으로 이루어진 자료구조 이고 다시 말하면 그래프는 여러 정점(vertex)들 같의 관계를 표현하는 조직도와 같다고 할 수 있겠다. 표현할 만한 예로는 노선도나, 지도와 같은 것들이 있겠다.
이후 다루게 될 트리 역시 그래프의 일종이라 할 수 있다. 트리와 달리 그래프에는 정점마다 간선이 존재할 수도 있고 없을 수도 있으며 부모-자식 관계라는 것이 존재하지 않는다!
인접 행렬은 2차원 배열로 그래프를 구현하는 방식이다. 간선이 존재하는 두 정점 칸은 1로 없는 칸은 0으로 채워주고 만약 가중치가 다른 그래프라면 해당 가중치 값을 넣어준다.
인접 리스트는 정점에 연결되어 있는 정점들만 리스트로 나타내는 그래프 표현 방식이다.
그래프에서 가장 중요한 부분이 바로 이 탐색이 아닐까? 정말 수도없이 사용하는 알고리즘이다!!
BFS, 넓이 우선 탐색이다. 정점을 기준으로 간선이 연결되어 있는 모든 정점들을 차례로 방문하고 찾고자 하는 정점을 만날 때 까지 반복한다. 일반적으로 Queue
를 사용하여 많이 구현한다.
DFS, 깊이 우선 탐색이다.
정점을 기준으로 간선이 연결되어 있는 정점 들 중 하나를 선택해 이동하고 다시 이동한 정점을 기준으로 다시 인접 정점을 선택한다. 연결되어있는 간선을 따라 찾고자 하는 정점을 만날 때 까지 진행하고 찾지 못하면 다시 이전 정점으로 돌아와 반복한다. 재귀함수를 통해서 구현하기도 하고 혹은 Stack
을 사용해 구현하기도 한다.
그래프의 연결 성분은 여러개의 노드의 집합에서 간선으로 연결된 각각의 그래프이다.
신장 트리는 그래프 내 모든 정점이 연결되어 있으면서 사이클이 없는 트리를 말한다! 간선들을 통해서 모든 노드들이 연결되어 있고 그 안에서 사이클이 존재 하지 않아야 한다.
BFS 혹은 DFS 를 사용해 그래프를 탐색하는데 사용된 간선들만을 추려서 완성한다.
[자료구조] 그래프 (Graph) - 인접행렬 vs 인접리스트, DFS, BFS, Connected Component, Spanning Tree
[Algorithm] 자료구조 그래프(Graph)란 무엇인가?