Skip to content

Latest commit

Β 

History

History
241 lines (117 loc) Β· 7.43 KB

Graph.md

File metadata and controls

241 lines (117 loc) Β· 7.43 KB

Graph

Graph μš©μ–΄ 정리

Graph μ’…λ₯˜

Graph κ΅¬ν˜„

Graph 탐색


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

객체 κ°„μ˜ 관계λ₯Ό ν‘œν˜„ν•  수 μžˆλŠ” 자료ꡬ쑰

ex) 지도, μ§€ν•˜μ²  λ…Έμ„ λ„μ˜ μ΅œλ‹¨ 경둜 λ“±

  • 정점(vertex; node)와 κ·Έ 정점을 μ—°κ²°ν•˜λŠ” κ°„μ„ (edge; arc)을 ν•˜λ‚˜λ‘œ λͺ¨μ•„ 놓은 자료ꡬ쑰

  • νŠΈλ¦¬λ„ κ·Έλž˜ν”„μ˜ νŠΉμˆ˜ν•œ ν˜•νƒœ


κ·Έλž˜ν”„ κ΄€λ ¨ μš©μ–΄ 정리

  • 인접 정점(adjacent vertex): 간선에 μ˜ν•΄ 직접 μ—°κ²°λœ 정점

  • 인접(adjacent) & 뢀속(incident): μž„μ˜μ˜ 두 정점이 ν•˜λ‚˜μ˜ κ°„μ„ μœΌλ‘œ 연결돼 μžˆμ„ 경우, 이 정점듀은 μ„œλ‘œ 인접(adjacent)ν•΄ μžˆλ‹€κ³  ν•œλ‹€. 같은 κ²½μš°μ— 이 간선은 두 λ…Έλ“œμ— 뢀속(incident)ν•œλ‹€κ³  ν•œλ‹€.

  • λΆ€λΆ„ κ·Έλž˜ν”„(subgraph): κ·Έλž˜ν”„μ— ν¬ν•¨λ˜λŠ” 일뢀 정점과 κ°„μ„ μœΌλ‘œλ§Œ κ·Έλ¦° κ·Έλž˜ν”„. λΆ€λΆ„ κ·Έλž˜ν”„ μ€‘μ—μ„œ μ›λž˜ κ·Έλž˜ν”„μ˜ 정점을 λͺ¨λ‘ ν¬ν•¨ν•œ λΆ€λΆ„ κ·Έλž˜ν”„λ₯Ό λΆ€λΆ„μ‹ μž₯ κ·Έλž˜ν”„(spanning graph) 라고 ν•œλ‹€.

  • μ •μ μ˜ 차수(degree): ν•œ μ •μ μ˜ μ°¨μˆ˜λŠ” ν•΄λ‹Ή 정점에 μ—°κ²°λœ κ°„μ„ μ˜ 수(ν˜Ήμ€ κ°„μ„  κ°€μ€‘μΉ˜μ˜ ν•©)λ₯Ό 가리킨닀.

    • λ°©ν–₯ κ·Έλž˜ν”„μ˜ 경우 μ™ΈλΆ€μ—μ„œ μ˜€λŠ” κ°„μ„ μ˜ 수λ₯Ό μ§„μž… 차수(in-degree) 라고 ν•˜λ©°, μ™ΈλΆ€λ‘œ ν–₯ν•˜λŠ” κ°„μ„ μ˜ 수λ₯Ό μ§„μΆœ 차수(out-degree) 라고 ν•œλ‹€.
  • 루프(loop) & isolated: 두 정점이 같은 정점인 κ°„μ„ (정점을 μžμ²΄μ— μ—°κ²°ν•˜λŠ” κ°„μ„ )을 loop라 ν•˜κ³  μž„μ˜μ˜ ν•œ 정점에 뢀속해 μžˆλŠ” 간선이 μ „ν˜€ 없을 λ•Œ ν•΄λ‹Ή 정점을 isolated vertex라고 ν•œλ‹€.

  • 경둜(path): 간선을 λ”°λΌκ°ˆ 수 μžˆλŠ” 길을 λ§ν•˜λ©°, 정점을 λ‚˜μ—΄ν•˜μ—¬ ν‘œμ‹œν•œλ‹€.

    • 경둜의 길이(length): 경둜λ₯Ό κ΅¬μ„±ν•˜λŠ” 데 μ‚¬μš©λœ κ°„μ„ μ˜ 수

    • simple path & elementary path: 경둜 μ€‘μ—μ„œ λ°˜λ³΅λ˜λŠ” 간선이 μ—†λŠ” 경우λ₯Ό simple ν•˜λ‹€κ³  ν•˜κ³  λ°˜λ³΅λ˜λŠ” 정점이 μ—†λŠ” 경우λ₯Ό elementary ν•˜λ‹€κ³  ν•œλ‹€.

  • 사이클(cycle): μ‹œμž‘ 정점과 μ’…λ£Œ 정점이 λ™μΌν•œ 경둜

  • μ—°κ²°(connected): 두 정점 사이에 κ²½λ‘œκ°€ μ‘΄μž¬ν•  λ•Œ 두 정점은 μ—°κ²°λ˜μ—ˆλ‹€κ³  ν•œλ‹€.

    • κ°•ν•œ μ—°κ²° & μ•½ν•œ μ—°κ²°: λ°©ν–₯κ·Έλž˜ν”„μ˜ μž„μ˜μ˜ λ…Έλ“œμŒ π‘Ž, 𝑏에 λŒ€ν•΄ π‘Žμ—μ„œ π‘λ‘œ κ°€λŠ” 경둜, π‘μ—μ„œ π‘Žλ‘œ κ°€λŠ” κ²½λ‘œκ°€ μ‘΄μž¬ν•œλ‹€λ©΄, ν•΄λ‹Ή λ°©ν–₯κ·Έλž˜ν”„λŠ” κ°•ν•œ μ—°κ²°(strongly connected) λ˜μ—ˆλ‹€κ³  λ§ν•œλ‹€. ν•˜μ§€λ§Œ λ‘˜ 쀑 ν•˜λ‚˜μ˜ 경둜만 μ‘΄μž¬ν•œλ‹€λ©΄, ν•΄λ‹Ή λ°©ν–₯κ·Έλž˜ν”„λŠ” μ•½ν•œ μ—°κ²°(weakly connected) λ˜μ—ˆλ‹€κ³  ν•œλ‹€.

κ·Έλž˜ν”„μ˜ μ’…λ₯˜

무방ν–₯ κ·Έλž˜ν”„ VS λ°©ν–₯ κ·Έλž˜ν”„

  • 무방ν–₯ κ·Έλž˜ν”„(Undirected Graph)

    • 무방ν–₯ κ·Έλž˜ν”„μ˜ 간선은 간선을 ν†΅ν•΄μ„œ μ–‘ λ°©ν–₯으둜 갈 수 μžˆλ‹€.
    • 정점 A와 정점 Bλ₯Ό μ—°κ²°ν•˜λŠ” 간선은 (A,B)와 같이 μ •μ μ˜ 쌍으둜 ν‘œν˜„ν•œλ‹€.
  • λ°©ν–₯ κ·Έλž˜ν”„(Directed Graph)

    • 간선에 λ°©ν–₯성이 μ‘΄μž¬ν•˜λŠ” κ·Έλž˜ν”„
    • A->B둜만 갈 수 μžˆλŠ” 간선은 <A,B>둜 ν‘œμ‹œν•œλ‹€.

κ°€μ€‘μΉ˜ κ·Έλž˜ν”„

  • κ°€μ€‘μΉ˜ κ·Έλž˜ν”„(Weighted Graph)
    • 간선에 λΉ„μš©μ΄λ‚˜ κ°€μ€‘μΉ˜κ°€ ν• λ‹Ήλœ κ·Έλž˜ν”„

μ—°κ²° κ·Έλž˜ν”„ VS λΉ„μ—°κ²° κ·Έλž˜ν”„

  • μ—°κ²° κ·Έλž˜ν”„(Connected Graph)

    • 무방ν–₯ κ·Έλž˜ν”„μ— μžˆλŠ” λͺ¨λ“  μ •μ μŒμ— λŒ€ν•΄μ„œ 항상 κ²½λ‘œκ°€ μ‘΄μž¬ν•˜λŠ” 경우
  • λΉ„μ—°κ²° κ·Έλž˜ν”„(Disconnected Graph)

    • 무방ν–₯ κ·Έλž˜ν”„μ—μ„œ νŠΉμ • μ •μ μŒ 사이에 κ²½λ‘œκ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우

사이클 VS λΉ„μˆœν™˜ κ·Έλž˜ν”„

  • 사이클(Cycle)

    • μ‹œμž‘ 정점과 μ’…λ£Œ 정점이 λ™μΌν•œ 경둜
  • μˆœν™˜(cycle)을 κ°€μ§€κ³  있으면 μˆœν™˜ κ·Έλž˜ν”„μ΄κ³  κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ λΉ„μˆœν™˜ κ·Έλž˜ν”„(acyclic)

μ™„μ „ κ·Έλž˜ν”„

  • μ™„μ „ κ·Έλž˜ν”„(Complete Graph)
    • κ·Έλž˜ν”„μ— 속해 μžˆλŠ” λͺ¨λ“  정점이 μ„œλ‘œ μ—°κ²°λ˜μ–΄ μžˆλŠ” κ·Έλž˜ν”„
    • 무방ν–₯ μ™„μ „ κ·Έλž˜ν”„
      • 정점 μˆ˜κ°€ n개이면 κ°„μ„ μ˜ μˆ˜λŠ” n*(n-1)/2
    • λ°©ν–₯ μ™„μ „ κ·Έλž˜ν”„
      • 정점 μˆ˜κ°€ n개이면 κ°„μ„ μ˜ μˆ˜λŠ” n*(n-1)


κ·Έλž˜ν”„μ˜ κ΅¬ν˜„

  • κ·Έλž˜ν”„λ₯Ό κ΅¬ν˜„ν•˜λŠ” λ°©λ²•μ—λŠ” 인접행렬(Adjacency Matrix)와 μΈμ ‘λ¦¬μŠ€νŠΈ(Adjacency List) 방식이 μžˆλ‹€.

1. 인접행렬(Adjacency Matrix)

2차원 λ°°μ—΄λ‘œ κ·Έλž˜ν”„μ˜ μ—°κ²° 관계λ₯Ό ν‘œν˜„ν•˜λŠ” 방식

각 정점을 μ—°κ²°ν•˜λŠ” 정점에 λ‹€λ₯Έ 정점듀이 인접 정점이라면 1, μ•„λ‹ˆλ©΄ 0을 λ„£μ–΄μ€€λ‹€.

λ§Œμ•½ 간선에 κ°€μ€‘μΉ˜κ°€ μžˆλŠ” κ·Έλž˜ν”„λΌλ©΄ 1 λŒ€μ‹ μ— κ°€μ€‘μΉ˜μ˜ 값을 직접 λ„£μ–΄μ£ΌλŠ” λ°©μ‹μœΌλ‘œ κ΅¬ν˜„

μž₯점

  1. 2차원 λ°°μ—΄ μ•ˆμ— λͺ¨λ“  μ •μ λ“€μ˜ κ°„μ„  정보λ₯Ό λ‹΄κΈ° λ•Œλ¬Έμ— λ°°μ—΄μ˜ μœ„μΉ˜λ₯Ό ν™•μΈν•˜λ©΄ 두 점에 λŒ€ν•œ μ—°κ²° 정보λ₯Ό μ‘°νšŒν•  λ•Œ O(1)의 μ‹œκ°„λ³΅μž‘λ„λ©΄ κ°€λŠ₯

  2. 직관적이며 μ‰½κ²Œ κ΅¬ν˜„ κ°€λŠ₯

단점

  1. λͺ¨λ“  정점에 λŒ€ν•΄ κ°„μ„  정보λ₯Ό λŒ€μž…ν•΄μ•Ό ν•˜λ―€λ‘œ μ •μ μ˜ κ°œμˆ˜κ°€ n개인 κ·Έλž˜ν”„λŠ” κ°„μ„ μ˜ μˆ˜μ™€ λ¬΄κ΄€ν•˜κ²Œ 항상 n^2의 λ©”λͺ¨λ¦¬ 곡간이 ν•„μš”ν•˜λ‹€.

  2. μΈμ ‘ν•œ λ…Έλ“œλ₯Ό μ°ΎκΈ° μœ„ν•΄μ„œλŠ” λͺ¨λ“  λ…Έλ“œλ₯Ό μ „λΆ€ μˆœνšŒν•΄μ•Ό ν•œλ‹€.


2. μΈμ ‘λ¦¬μŠ€νŠΈ(Adjacency List)

리슀트둜 κ·Έλž˜ν”„μ˜ μ—°κ²° 관계λ₯Ό ν‘œν˜„ν•˜λŠ” 방식

각각의 정점에 μΈμ ‘ν•œ 정점듀을 리슀트둜 ν‘œμ‹œν•œ 것이닀.

μž₯점

  1. μ •μ λ“€μ˜ μ—°κ²° 정보λ₯Ό 탐색할 λ•Œ O(n)의 μ‹œκ°„μ΄λ©΄ κ°€λŠ₯ (n: κ°„μ„ μ˜ 개수)

  2. ν•„μš”ν•œ 만큼의 κ³΅κ°„λ§Œ μ‚¬μš©ν•˜κΈ° 떄문에 κ³΅κ°„μ˜ λ‚­λΉ„κ°€ 적닀.

단점

  1. νŠΉμ • 두 점이 μ—°κ²°λ˜μ—ˆλŠ”μ§€ ν™•μΈν•˜λ €λ©΄ 인접행렬에 λΉ„ν•΄ μ‹œκ°„μ΄ 였래 κ±Έλ¦°λ‹€. (배열보닀 search 속도가 느림)

  2. 인접행렬에 λΉ„ν•΄ κ΅¬ν˜„μ΄ 비ꡐ적 μ–΄λ ΅λ‹€.


κ·Έλž˜ν”„μ˜ 탐색

첫 μ •μ μ—μ„œλΆ€ν„° κ·Έλž˜ν”„μ— μ‘΄μž¬ν•˜λŠ” λͺ¨λ“  정점듀을 λͺ¨λ‘ ν•œλ²ˆμ”© λ°©λ¬Έν•˜λŠ” 것

κ·Έλž˜ν”„ νƒμƒ‰μ˜ 방법은 깊이 μš°μ„  탐색(DFS) κ³Ό λ„ˆλΉ„ μš°μ„  탐색(BFS) 방식이 μžˆλ‹€.

두 방식 λͺ¨λ‘ 쑰건 λ‚΄μ˜ λͺ¨λ“  λ…Έλ“œλ₯Ό κ²€μƒ‰ν•œλ‹€λŠ” μ μ—μ„œ μ‹œκ°„ λ³΅μž‘λ„λŠ” 동일

  • 인접 리슀트 : O(V+E)
  • 인접 ν–‰λ ¬ : O(VΒ²)

1. 깊이 μš°μ„  탐색(DFS)

탐색 λ…Έλ“œμ˜ 인접 λ…Έλ“œμ˜ μžμ‹ λ…Έλ“œλ“€μ„ λͺ¨λ‘ νƒμƒ‰ν•˜κ³ , λ‹€μ‹œ λŒμ•„κ°€μ„œ 탐색 λ…Έλ“œμ˜ λ‹€λ₯Έ 인접 λ…Έλ“œ μžμ‹λ“€μ„ λͺ¨λ‘ νƒμƒ‰ν•˜λŠ” 방법

μ™Όμͺ½μ„ λ¨Όμ € νƒμƒ‰ν•˜λƒ, 였λ₯Έμͺ½μ„ λ¨Όμ € νƒμƒ‰ν•˜λƒ 같은 μˆœμ„œλŠ” μ€‘μš”ν•˜μ§€ μ•Šλ‹€.

μŠ€νƒ λ˜λŠ” μž¬κ·€ν•¨μˆ˜λ‘œ κ΅¬ν˜„


2. λ„ˆλΉ„ μš°μ„  탐색(BFS)

탐색 λ…Έλ“œμ˜ μΈμ ‘ν•œ λ…Έλ“œλ₯Ό λ¨Όμ € νƒμƒ‰ν•˜λŠ” 방법

주둜 두 λ…Έλ“œ μ‚¬μ΄μ˜ μ΅œλ‹¨ 경둜λ₯Ό μ°Ύκ³  싢을 λ•Œ 이 방법을 선택

큐λ₯Ό μ΄μš©ν•΄μ„œ κ΅¬ν˜„


πŸ“š μ°Έκ³ 

Graph 1

Graph 2

Graph 3

Graph 4

Graph 5

DFS & BFS




⁉️ QnA

  1. κ·Έλž˜ν”„λ₯Ό κ΅¬ν˜„ν•˜λŠ” λ°©μ‹λ“€μ˜ μž₯단점을 λΉ„κ΅ν•˜μ‹œμ˜€.
  1. κ·Έλž˜ν”„μ™€ 트리의 차이점에 λŒ€ν•΄μ„œ μ„€λͺ…ν•˜μ‹œμ˜€.
  1. BFS와 DFS의 차이점에 λŒ€ν•΄μ„œ μ„€λͺ…ν•˜μ‹œμ˜€.