Graph

Graph 정의

정점(Vertex)과 간선(Edge)의 집합

그래프 용어 정리

  • 방향 그래프 (Directed Graph) : 간선에 방향이 있는 그래프

  • 무방향 그래프(Undirected Graph) : 간선에 방향이 없는 그래프

  • 차수(Degree) : 임의의 정점에 인접한 정점의 수

  • 경로 : 시작 정점 u로부터 도착 정점 v까지의 정점들

    • 단순 경로 : 경로 내 모든 정점들이 다른 경우
    • Cycle : 시작 정점과 도착 정점이 동일한 경우
  • 연결 성분 (Connected Component) : 그래프에서 정점들이 서로 연결되어 있는 부분

  • 가중치 그래프 (Weighted Graph) : 간선에 가중치가 부여된 그래프

  • 신장트리 (Spanning Tree) : 그래프가 하나의 연결성분으로 구성되어 있을 때, 그래프의 모든 정점들을 cycle없이 연결하는 부분 그래프

    그래프 구현 방법

    그래프를 구현하기 위한 방법으로 2가지가 존재한다.

  1. 인접행렬 (Adajacent Matrix) : 2차원 배열로 표현하는 방법으로 n개의 정점이 존재한다고 하였을 떄 , n x n 배열로 표현하여 그래프의 정점 i 와 정점 j 간에 연결선이 존재하면 1을 표시하고, 연결선이 존재하지 않으면 0을 표시하여 구성한다. dense graph를 표현할떄 유리하다.
  • 장점 : 정점간의 연결선 여부를 O(1) 으로 파악 가능
  • 단점 : O(N^2)의 공간 복잡도를 가짐
  1. 인접 리스트 (Adjacency List) : 정점과 해당 정점에 인접한 정점들을 연결리스트로 표현하는 방식으로, n개의 정점이 존재한다고 하였을떄, n x n 연결리스트로 구성된다. sparse graph를 표현할떄 유리하다.
  • 장점: O(N+E)의 공간 복잡도를 가짐
  • 단점 : 정점간의 연결선 여부를 O(N) 으로 파악가능
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
public class Graph<T> {

// 연결리스트
private Map<Vertex<T>, List<Vertex<T>>> adjVertices = new HashMap<>();

void addVertex(T label){
adjVertices.putIfAbsent(new Vertex(label),new ArrayList<>());
}

void removeVertex(T label){
Vertex vertex = new Vertex(label);
adjVertices.values().stream().forEach((e)->e.remove(vertex));
adjVertices.remove(vertex);
}

void addEdge(T label1,T label2){
Vertex<T> v1 = new Vertex(label1);
Vertex<T> v2 = new Vertex(label2);
adjVertices.get(v1).add(v2);
adjVertices.get(v2).add(v1);
}

void removeEdge(T label1, T label2){
Vertex v1 = new Vertex(label1);
Vertex v2 = new Vertex(label2);
List<Vertex<T>> vertices1 = adjVertices.get(v1);
List<Vertex<T>> vertices2 = adjVertices.get(v2);
if(vertices1 != null){
vertices1.remove(v2);
}
if(vertices2 != null){
vertices2.remove(v1);
}
}
List<Vertex<T>> getAdjvertices(T label ){
return adjVertices.get(new Vertex(label));
}
public class Vertex<T>{
T label;
Vertex(T label){
this.label = label;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Vertex vertex = (Vertex) o;
return Objects.equals(label, vertex.label);
}

@Override
public int hashCode() {
return Objects.hash(label);
}
}
}
Read more

B Tree

B Tree는 다수의 키를 가진 Node로 구성되어 다방향 탐색이 가능한 균형 트리이다.

B Tree는 이진트리와 다르게, 하나의 노드에 다수개의 키를 저장할 수 있어, Tree의 높이를 낮추어 대용량 데이터 처리에 효율적임으로, 관계형 데이터베이스의 기본 자료구조로서 활용된다.

( 균형 트리란 ? 왼쪽,오른쪽 subtree의 높이 차이를 줄여, O(logN)의 시간복잡도를 가지고, 탐색,삼입,삭제 연산을 수행할수 있다. )

대표적으로 AVL Tree, RB Tree, B tree…등이 있다.

차수가 M인 B트리는 다음과 같은 정의를 갖는다.
(= 트리 노드의 최대 자식 노드의 개수가 M이며, 이떄 M은 2이상의 정수여야한다.)

  1. 모든 leef node는 동일한 깊이를 갖는다.
  2. 각 internal node의 자식수는 M/2 이상 , M 이하이다.
  3. Root Node의 자식수는 2 이상이다.
  4. Node의 key값들은 정렬된 상태를 유지한다.
Read more