🚧

κ·Έλž˜ν”„(Graph)

purpplee 2021. 12. 5. 22:26

κ·Έλž˜ν”„λž€?

트리처럼 λ…Έλ“œ(데이터)듀이 μ—°κ²°λ˜μ–΄ μžˆλŠ” 자료ꡬ쑰둜, λ…Έλ“œκ°„μ˜ 관계λ₯Ό ν‘œν˜„ν•  λ•Œ 주둜 쓰인닀. νŠΈλ¦¬μ™€ 달리 λ…Έλ“œλ“€μ— λΆ€λͺ¨/μžμ‹ 관계가 없이 μ „λΆ€ μ΄μ–΄μ§ˆ 수 μžˆλ‹€. 그리고 λ…Έλ“œμ™€ λ…Έλ“œ 사이λ₯Ό μž‡λŠ” 선을 간선이라고 ν•œλ‹€.

 

이 간선은 λ°©ν–₯을 λ‚˜νƒ€λ‚Ό μˆ˜λ„ μžˆλ‹€. λ°©ν–₯이 μžˆλŠ” κ·Έλž˜ν”„λ₯Ό Directed Graph 라고 ν•˜κ³  λ°©ν–₯이 μ—†λŠ” κ·Έλž˜ν”„λ₯Ό Undirected Graph 라고 ν•œλ‹€. λ°©ν–₯ κ·Έλž˜ν”„λŠ” 단방ν–₯ ν˜Ήμ€ μ–‘λ°©ν–₯μœΌλ‘œλ„ ν‘œν˜„λœλ‹€. 참고둜 νŠΈλ¦¬λŠ” μœ„, μ•„λž˜λ‘œ 흐λ₯΄λ―€λ‘œ λ°©ν–₯ κ·Έλž˜ν”„μΈλ° λ°©ν–₯을 μƒλž΅ν•œ 것이닀.

 

μ΄μ–΄μ§€λŠ” λ…Έλ“œλ“€μ„ 따라가닀보면 처음 μ‹œμž‘ν•œ λ…Έλ“œλ‘œ λŒμ•„μ˜€λŠ” κ·Έλž˜ν”„λ„ μžˆλ‹€. 이것을 사이클이라고 ν•˜λŠ”λ°, 사이클이 ν•˜λ‚˜λΌλ„ μžˆλŠ” κ·Έλž˜ν”„λ₯Ό Cyclic Graph, 사이클이 ν•˜λ‚˜λ„ μ—†λŠ” κ·Έλž˜ν”„λ₯Ό Acyclic Graph 라고 ν•œλ‹€.

 μ°Έκ³ λ‘œ νŠΈλ¦¬λŠ” 맨 μœ„ λ£¨νŠΈλΌλŠ” 좜발점이 있고 사이클이 μ—†κ³  μœ„, μ•„λž˜λ‘œλ§Œ 흐λ₯΄λŠ” 계측 ν˜•νƒœμ˜ λ°©ν–₯ κ·Έλž˜ν”„λ‹€!

 

κ·Έλž˜ν”„ ν‘œν˜„ 방법

Adjacency Matrix

κ·Έλž˜ν”„λ₯Ό 2차원 배열에 ν‘œν˜„ν•œλ‹€. μ—°κ²°λ˜μ–΄ 있으면 1 μ•„λ‹ˆλΌλ©΄ 0의 κ°’μœΌλ‘œ ν‘œν˜„ν•œλ‹€.

 

Adjacency List

κ·Έλž˜ν”„λ₯Ό Linked List 둜 ν‘œν˜„ν•œλ‹€. λ…Έλ“œμ™€ μ—°κ²°λ˜μ–΄ μžˆλŠ” λ‹€λ₯Έ λ…Έλ“œλ₯Ό μˆœμ„œ 상관 없이 μ—°κ²°ν•œλ‹€. 그런데 a λ…Έλ“œκ°€ b λ…Έλ“œμ™€ μ—°κ²°λ˜μ–΄ μžˆλŠ”κ²ƒμ„ ν‘œν˜„ν•  λ•Œ, a->b, b->a 총 λ‘λ²ˆμœΌλ‘œ ν‘œν˜„ν•΄μ•Όν•΄μ„œ μ—°κ²°λ¦¬μŠ€νŠΈλŠ” κ°„μ„ μ˜ 개수 mκ°œλ³΄λ‹€ 2λ°° 더 λ§Žμ€ 2m개의 λ…Έλ“œλ₯Ό κ°–κ²Œ λœλ‹€.

 

Graph 검색 μ•Œκ³ λ¦¬μ¦˜

DFS(Depth-First Search)

μ΄μ§„νƒμƒ‰νŠΈλ¦¬μ—μ„œμ˜ inorder, preorder, postorder 탐색이 λ°”λ‘œ 깊이 μš°μ„  탐색 방법이닀. 루트 λ…Έλ“œμ˜ child λ…Έλ“œ, κ·Έ λ…Έλ“œμ˜ child λ…Έλ“œ... 점점 μ•„λž˜λ‘œ νƒμƒ‰ν•˜λŠ” 방식이닀.

 

BFS(Breadth-First Search)

넓이 μš°μ„  탐색은 루트 λ…Έλ“œμ˜ 같은 레벨 상에 μžˆλŠ” λͺ¨λ“  child λ…Έλ“œλ₯Ό λ‹€ λ°©λ¬Έ ν•˜κ³  κ·Έ λ‹€μŒ λ ˆλ²¨μ„ λ°©λ¬Έν•˜λŠ” 방식이닀.

 

μ‹ μž₯ 트리(Spanning Tree)

Spanning TreeλŠ” μ—°κ²° κ·Έλž˜ν”„(쀑간에 λŠκ²¨μžˆμ§€ μ•Šμ€ κ·Έλž˜ν”„) 의 λΆ€λΆ„ κ·Έλž˜ν”„λ“€μ΄λ‹€. λͺ¨λ“  λ…Έλ“œλ“€μ΄ ν¬ν•¨λ˜κ³  사이클이 μ‘΄μž¬ν•˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€.

 

μ΅œμ†ŒλΉ„μš© μ‹ μž₯트리(MST, Minimum Cost Spanning Tree)

κ°„μ„ λ“€μ˜ κ°€μ€‘μΉ˜λ₯Ό ν•©ν•œ 값이 μ΅œμ†Œκ°€ λ˜λŠ” μ‹ μž₯ νŠΈλ¦¬λ‹€. 즉, μ΅œμ†Œ λΉ„μš©μœΌλ‘œ λ§Œλ“€ 수 μžˆλŠ” μ‹ μž₯ 트리. 무방ν–₯ κ·Έλž˜ν”„μΌ λ•Œ ꡬ할 수 μžˆλ‹€. μ—°κ²° κ·Έλž˜ν”„μ—μ„œ μ΅œμ†ŒλΉ„μš© μ‹ μž₯트리λ₯Ό μ°Ύμ•„λ‚΄λŠ” μ•Œκ³ λ¦¬μ¦˜ μ€‘μ—λŠ” 크루슀칼 μ•Œκ³ λ¦¬μ¦˜(Kruskal Algorithm)이 λŒ€ν‘œμ μ΄λ‹€.

λ°˜μ‘ν˜•