들어가기에 앞서...
이 포스트는 2학년때 수강한 자료구조 수업의 자료와 각종 스터디 블로그를 참고하여 작성되었다.
vertex(정점)와 edge(간선)로 구성된 자료구조.
그래프의 제한사항
자기 간선(self edge)또는 자기 루프(self loop) 없음
자기루프(self-loop): 정점에서 진출하는 간선이 곧바로 자기 자신에게 진입하는 경우 자기 루프를 가졌다고 한다. 다른 정점을 거치지 않는다.
동일 간선의 중복 없음
경로의 길이(length)
경로상에 있는 간선의 수
단순 경로(simple path)
처음과 마지막 정점만 같고 나머지는 모두 다름
단순 방향 경로(siple directed path)
사이클(cycle)
처음과 마지막 정점이 같은 단순 경로
Acyclic (no cycle) graph = Tree
그래프 관점에서 볼 때, 트리는 사이클이 없는 연결 그래프라 볼 수 있다.
차수(degree)
정점에 부속한 간선들의 수
vertex 1
의 degree : 3 (0, 1, 2)vertex 1
의 in-degree : 1 (0이 진입)vertex 1
의 out-degree : 2 (2, 3으로 진출) nxn의 2차원 배열
연결되어있으면 1, 연결되어있지 않으면 0
필요 공간 : n^2
비트
장점 : 직관적, 쉬운 구현
단점 : 불필요한 정보 저장, 그래프의 크기가 커지면 메모리 초과 발생 가능
리스트의 노드 구조를 정점필드와 주소(link)필드로 구성하여 정점 i
에 대한 인접리스트에 정점 i
와 인접한 다른 정점들을 나타내는 노드들을 포함시킨다.
각 정점의 리스트는 헤더 노드를 가지며 리스트 헤더들은 노드 번호의 오름차순으로 정렬되어 있다. => 빠른 접근 가능
❗ (그러나 리스트 내의 노드 순서에는 특별한 의미가 없다.)
장점 : 필요한 정보만 저장하여 메모리 절약
단점 : 인접행렬에 비해 다소 어려움
인접리스트(adjacency list)의 문제점을 해소( (0,1)과 (1,0)이 중복되는 문제 )
=> vertex 중심의 인접리스트를 edge중심의 리스트로 변경한다.
위 그래프에서 vertex 0
은 E0으로 이동 후 i-link에 따라 E1으로 이동한다. 그 다음 E1에서 i-link 에 따라 리스트가 끝난다(null을 만남).
같은 원리로 vertex 1
의 리스트는 E0 -> E2 -> E3
가 된다.
그래프 간선에 가중치를 부여한다.
그래프 - https://m.blog.naver.com/occidere/220923695595
자기 루프 정의 - https://velog.io/@kaitlin_k/graph
인접리스트, 다중 인접리스트 - https://kingpodo.tistory.com/46
가중치 간선 그림 - https://www.softwaretestinghelp.com/graph-implementation-cpp/