그래프
그래프는 유한한 정점, 노드 또는 점의 집합으로 구성됩니다. 방향이 없는 그래프의 경우 순서가 지정되지 않는 쌍의 정점으로, 방향이 있는 그래프의 경우는 순서가 지정된 쌍의 정점으로 구성됩니다.
용어설명
- Vertex: 노드
- Edge: 노드 간의 연결
- Weighted/Unweighted: 노드 간 거리에 할당된 값
- Directed/Undirected: 노드 간 거리에 할당된 방향
사용처
- 소셜 네트워크
- 위치, 지도
- 라우팅 알고리즘
- 시각적 계층
- 파일시스템 최적화
- 어느곳이든!
저장하는 방식
Adjacency List (인접리스트)
- Vertex 추가: O(1)
- Edge 추가: O(1)
- Vertex 삭제: O(V + E)
- Edge 삭제: O(E)
- 검색: O(V + E)
- 공간복잡도: O(V + E)
Adjacency Matrix (인접행렬)
-
Vertex 추가: O(V^2)
-
Edge 추가: O(1)
-
Vertex 삭제: O(V^2)
-
Edge 삭제: O(1)
-
검색: O(1)
-
공간복잡도: O(V^2)
-
인접리스트가 행렬보다 공간을 덜 차지 한다.
-
인접리스트가 행렬보다 모든 간선을 순회할 때 빠르다.
-
인접행렬이 리스트보다 특정 간선을 찾는데 더 빠르다.
DFS (깊이우선순회)
(Recursive)
- 시작 노드를 하나 받는다.
- 종료 결과를 저장(마지막에 반환할)하는 리스트를 생성한다.
- 방문한 정점을 저장할 객체를 생성한다.
- 정접을 인자로 받는 helper 함수를 생성한다.
- 정점이 비어있으면 반환한다.
- 인자로 받은 정점을 방문 객체에 저장하고, 결과 리스트에 저장한다.
- 그 정점의 인접리스트에 있는 모든 값에 대해서 반복한다.
- 그 값들 중 방문되지 않는게 있다면, 그 정점으로 helper 함수를 재귀적으로 호출한다.
- 시작 정점으로 helper 함수 를 실행한다.
- 결과 리스트를 반환한다.
(Interative)
- 시작 노드를 하나 받는다.
- 정점을 추적하도록 돕는 스택을 생성한다.
- 최종 결과를 저장하는 리스트를 생성한다.
- 방문한 노드를 저장할 객체를 생성한다.
- 시작 노드를 스택에 넣고 방문한 것으로 체크한다.
- 스택 안에 값이 있다면 아래를 반복한다.
- 스택에서 노드를 하나 꺼낸다.
- 방문하지 않은 노드라면 방문한 것으로 체크하고, 결과 리스트에 추가한다. 그리고 이웃 노드들을 스택에 넣는다.
- 결과를 반환한다.
BFS (넓이우선순회)
- 시작 노드를 하나 받는다.
- 큐를 생성하고 시작 노드를 넣는다.
- 방문한 노드를 저장할 배열을 만든다.
- 방문한 노드를 저장할 객체를 만든다.
- 큐에 아무것도 없을 때까지 반복한다.
- 큐에서 노드하나를 꺼내서 방문한 노드 배열에 넣는다.
- 방문한 노드의 인접리스트의 각 노드에 대해서 반복한다.
- 해당 노드가 방문한 노드가 아니라면, 그 노드를 방문한 것으로 체크하고 큐에 넣는다..
- 루프가 종료되면 방문한 배열을 반환한다.