# Graph
Graph 를 표현하는 2가지 방식
---
- 인접 행렬- 2D Array : 공간 낭비가 심함 / 시간 복잡도가 O(n^2) / undirected 인 경우 diagonal (대각선) 을 기준으로 대칭임.
- 인접 리스트 - Linked List: 공간을 효율적으로 사용할 수 있음 / 시간 복잡도와 공간복잡도가 O(V+E)
- 둘 중에 어떤 것을 쓸까 생각해보면, edge 수가 많은 경우 matrix를 쓰는게 좋다. 왜냐하면 공간과 시간이 인접리스트에 비해서 그렇게 소모되진 않으니까. 또한, prim's 알고리즘이나 다익스트라 알고리즘을 사용하는 경우 코드의 간결함을 위해서 배열을 쓰는 경우가 있다.
- 하지만. 그 외의 경우네는 인접리스트가 시간 복잡도나 공간 복잡도가 인접 행렬에 비해서 적은 편이기 때문에 사용하는 것을 권장한다
Tree 와 Graph 의 차이
---
- Tree 는 Graph의 제한된 형태. 즉, Tree는 Graph 의 부분집합임. 모든 Tree 는 Graph 이지만, 모든 Graph 는 Tree가 아님
Graph의 사례
---
- Map 은 그래프를 사용해서 표현될 수 있고, 두 도시 사이의 최단거리를 찾는 알고리즘이 필요한 서비스에서 사용 가능
- Topological sort를 통해서 의존성이 있는 여러 업무들에 대한 정렬을 할 수 있음
- 현재 state 에서 legal 한 move가 무엇인지 나타내는 state diagram 에 사용될 수 있음.
- 소셜 네트워크
Bipartite 그래프란?
---
- Vertex 들이 두 개의 독립적인 집합으로 구분될 수 있는 그래프를 bipartite 그래프라고 부름.
- Vertex가 주어졌을 때 bipartite인지 아닌지 알아볼 수 있는 방법은? BFS 와 coloring 을 사용하자
1. Source 를 red 로 색칠한다
2. 인접한 모든 노드들을 blue로 색칠한다
3. 거기서 또 인접한 노드들을 red 로 색칠한다
4. 만약 색칠하려고 하는데 내가 blue 인데 이웃도 blue 로 칠해야하는 경우가 오면 bipartite 가 아니라고 판단할 수 있음.
**DFS 로도 역시 bipartite 인지 구분할 수 있음*
그래프의 활용 사례
---
- Os 의 resource allocation graph
- Airline system 의 effective route optimization
- Maze problem
- DAG((Directed Acyclic Graph)
그래프의 장점
---
- Shortest path 를 알 수 있음
- Neighbors of nodes 를 알 수 있음
- DFS 와 BFS 와 같은 알고리즘을 사용할 수 있음.
그래프의 단점
---
- Pointer 를 너무 많이 사용하여 다루기 복잡함
- 메모리 사용량이 많음
- 인접행렬로 만들면 graph 의 multiplication 이나 parallel edge 를 사용하기 어려움