그래프(Graph)는 노드(node)와 간선(edge)으로 이루어져 있는 자료구조로, 노드는 데이터를 저장하고 간선은 노드 간의 관계를 나타낸다.
이러한 그래프는 여러 분야에서 사용되며, 예를 들어 지도에서 도시를 연결하는 경로, 컴퓨터 네트워크에서 서버와 클라이언트 간의 연결, 또는 소셜 네트워크에서 친구 관계를 나타내는 등 다양한 분야에서 활용된다.
용어 | 설명 |
---|---|
노드(Node) | 그래프의 한 요소로서, 데이터를 저장하는 지점이며, 정점(Vertex) 또는 포인트(Point)라고도 한다. |
간선(Edge) | 그래프의 노드들을 연결하는 선이다. 간선은 무방향 그래프에서는 단순한 연결을 나타내며, 방향 그래프에서는 방향성이 있는 연결을 나타낸다. |
인접(Adjacent) | 두 노드가 간선으로 연결 되어 있는 경우 인접하다고 한다. 인접한 노드들을 인접 노드(Adjacent Nodes) 또는 이웃 노드(Neighbor Nodes)라고 한다. |
경로(Path) | 노드와 간선을 따라 이동하여 얻는 순서대로 나열된 노드들의 시퀀스이다. 경로의 길이는 해당 경로에 포함된 간선의 수이다. |
사이클(Cycle) | 그래프에서 같은 노드를 시작점과 끝점으로 하는 경로이다. 사이클이 없는 그래프를 트리(Tree)라고 한다. |
차수(Degree) | 노드에 연결된 간선의 수를 나타낸다. 무방향 그래프에서는 해당 노드의 차수가 해당 노드와 연결된 간선의 개수와 같다. 방향 그래프에서는 차수를 나누어 들어오는 간선의 수와 나가는 간선의 수로 나눌 수 있다. |
가중치(Weight) | 간선에 할당된 값으로, 경로의 가중치는 해당 경로를 구성하는 간선의 가중치의 합이다. |
무방향 그래프는 간선에 방향이 없는 그래프로 간선을 통해 양방향의 정점으로 갈 수 있다. 정점 A와 정점 B를 잇는 간선을 (A, B)와 같이 표현할 수 있는데, 무방향 그래프에서는 (A, B)와 (B, A)가 같은 간선이 된다.
방향 그래프는 간선에 방향이 존재하는 그래프로 간선을 통해 한쪽으로만 갈 수 있다. 정점 A와 정점 B를 잇는 간선을 <A, B>와 같이 표현할 수 있고, 방향 그래프에서는 <A, B>와 <B, A>는 서로 다른 간선이다.
가중치 그래프는 간선에 가중치(weight)가 할당된 그래프이다. 가중치는 간선의 비용이나 거리 등을 나타내며, 최단 경로나 최소 비용 등을 계산할 때 사용된다.
연결 그래프는 모든 노드가 최소 하나 이상의 경로로 연결된 그래프이다. 연결 그래프는 단일 연결 요소(Single Connected Component)로 이루어져 있다.
비연결 그래프는 최소 하나 이상의 노드가 다른 노드와 경로로 연결되어 있지 않은 그래프이다. 비연결 그래프는 여러 개의 연결 요소(Connected Component)로 이루어져 있다.
트리(Tree)는 그래프의 특수한 형태로, 사이클을 가지지 않는 연결 그래프이다.
그래프에 속해 있는 모든 정점이 서로 연결된 그래프를 완전 그래프(complete graph)라고 한다. 무방향 완전 그래프의 정점 수를 n이라고 한다면 간선의 수는 n * (n - 1)/2이다.
부분 그래프(Subgraph)는 어떤 그래프의 일부 정점과 간선으로 이루어진 그래프이다.
=> 인접행렬과 인접리스트는 각각의 장단점이 있으므로, 그래프의 특성에 따라 적절한 방식을 선택해야 한다.
깊이 우선 탐색은 그래프의 루트 노드부터 시작하여 한 분기(branch)의 끝까지 탐색한 후, 다음 분기로 넘어가서 탐색하는 방법이다. 즉, 한 노드에서 시작해 모든 자식 노드를 우선적으로 탐색하고, 자식 노드들을 탐색한 후에 부모 노드로 돌아가 다른 형제 노드를 탐색한다. 이러한 방법은 스택(Stack) 자료구조를 이용하여 구현할 수 있다.
넓이 우선 탐색은 그래프의 루트 노드부터 시작하여 인접한 노드를 모두 탐색한 후, 다음 depth의 노드를 탐색하는 방법이다. 즉, 한 노드에서 시작해 형제 노드들을 먼저 탐색하고, 형제 노드들의 자식 노드를 모두 탐색한 후에 다음 depth의 형제 노드들을 탐색한다. 이러한 방법은 큐(Queue) 자료구조를 이용하여 구현할 수 있다.