πŸ“’  κ·Έλž˜ν”„(Graph)

  • κ·Έλž˜ν”„(Graph) : (V,E)쌍, μ—¬κΈ°μ„œ V,EλŠ” 각각

    πŸ‘‰ V : 정점(Vertex)이라 λΆˆλ¦¬λŠ” λ…Έλ“œμ˜ 집합
    πŸ‘‰ E : κ°„μ„ (Edge)이라 λΆˆλ¦¬λŠ” μ •μ μŒλ“€μ˜ 집합

  • 정점(V)κ³Ό κ°„μ„ (E)은 μ›μ†Œ, 즉 정보λ₯Ό μ €μž₯ν•œλ‹€.

 

πŸ“’  간선에 λ”°λ₯Έ κ·Έλž˜ν”„ μœ ν˜•

  • λ°©ν–₯κ°„μ„ (Directed edgd)

    πŸ‘‰ μ •μ λ“€μ˜ μˆœμ„œμŒ (u,v)
    πŸ‘‰ u : μ‹œμ (Origin)
    πŸ‘‰ v : 쒅점(Destination)

  • λ°©ν–₯κ·Έλž˜ν”„(Directed Graph)

    πŸ‘‰ λͺ¨λ“  간선이 λ°©ν–₯간선인 κ·Έλž˜ν”„

λ°©ν–₯κ·Έλž˜ν”„ μ˜ˆμ‹œ : ν•­κ³΅νŽΈλ§

  • 무방ν–₯κ°„μ„ (Undirected edge)

    πŸ‘‰ μ •μ λ“€μ˜ 무순쌍 (u,v)

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

    πŸ‘‰ 무방ν–₯κ°„μ„ μœΌλ‘œ 이루어진 κ·Έλž˜ν”„

무방ν–₯κ·Έλž˜ν”„ μ˜ˆμ‹œ : ν•­λ‘œλ§

  • κ·Έλž˜ν”„ μ‘μš©λΆ„μ•Ό

    πŸ‘‰ ꡐ톡망 : κ³ μ†λ„λ‘œλ§, 항곡노선망
    πŸ‘‰ 컴퓨터 λ„€νŠΈμ›Œν¬ : LAN(Local Area Network), 인터넷, μ›Ή
    πŸ‘‰ λ°μ΄ν„°λ² μ΄μŠ€ : ER-Dirgram
    πŸ‘‰ κ·Έ 외에도, μ•„μ£Ό λ§Žμ€ λΆ„μ•Όμ—μ„œ κ·Έλž˜ν”„ μ‘μš©λΆ„μ•Όκ°€ λ§Žλ‹€.

 

πŸ“’  κ·Έλž˜ν”„ μš©μ–΄μ •λ¦¬

이런 κ·Έλž˜ν”„κ°€ μžˆλ‹€ κ°€μ •

  • κ°„μ„ μ˜ 끝점(end Vertex, endpoint)

    πŸ‘‰ 정점 U와 VλŠ” a의 양끝점

  • μ •μ μ˜ λΆ€μ°©(Incident)κ°„μ„ 

    πŸ‘‰ a,d,bλŠ” V에 λΆ€μ°©ν•œλ‹€.

  • μ •μ μ˜ 인접(Adjacent)정점

    πŸ‘‰ U와 VλŠ” μΈμ ‘ν•˜λ‹€.

  • μ •μ μ˜ 차수(Degree)

    πŸ‘‰ X의 μ°¨μˆ˜λŠ” 5λ‹€.

  • 병렬 κ°„μ„ (Parallel edges)

    πŸ‘‰ h와 iλŠ” 병렬 κ°„μ„ 

  • 루프(Loop λ˜λŠ” self-loop)

    πŸ‘‰ jλŠ” 루프닀.

이런 κ·Έλž˜ν”„κ°€ μžˆλ‹€ κ°€μ •

  • 경둜(Path)

    πŸ‘‰ 정점과 κ°„μ„ μ˜ κ΅λŒ€μ—΄
    πŸ‘‰ μ •μ μœΌλ‘œ μ‹œμž‘ν•˜μ—¬ μ •μ μœΌλ‘œ λλ‚œλ‹€.
    πŸ‘‰ 각 간선은 κ·Έ μ–‘λμ μœΌλ‘œ μ‹œμž‘ν•˜κ³  λλ‚œλ‹€.
  • λ‹¨μˆœκ²½λ‘œ(Simple path)

    πŸ‘‰ λͺ¨λ“  정점과 간선이 μœ μΌν•œ 경둜

  • μ˜ˆμ‹œ

    πŸ‘‰ P1 = (V,b,X,h,Z)λŠ” λ‹¨μˆœκ²½λ‘œ ( μœ„ κ·Έλž˜ν”„μ—μ„œ      경둜 )
    πŸ‘‰ P2 = (U,c,W,e,X,g,Y,f,W,d,V)λŠ” λΉ„λ‹¨μˆœκ²½λ‘œ ( μœ„ κ·Έλž˜ν”„μ—μ„œ      경둜 )

이런 κ·Έλž˜ν”„κ°€ μžˆλ‹€ κ°€μ •

  • 싸이클(Cycle)

    πŸ‘‰ 정점과 간선이 κ΅λŒ€ μ›ν˜•
    πŸ‘‰ 각 간선은 κ·Έ μ–‘λμ μœΌλ‘œ μ‹œμž‘ν•˜κ³  λλ‚œλ‹€.

  • λ‹¨μˆœμ‹Έμ΄ν΄(Simple Cycle)

    πŸ‘‰ λͺ¨λ“  정점과 간선이 μœ μΌν•œ 싸이클

  • μ˜ˆμ‹œ

    πŸ‘‰ C1 = (V,b,X,g,Y,f,W,c,U,a)λŠ” λ‹¨μˆœμ‹Έμ΄ν΄ ( μœ„ κ·Έλž˜ν”„μ—μ„œ      κ²½λ‘œ )
    πŸ‘‰ C2 = (U,c,W,e,X,g,Y,f,W,d,V,a)λŠ” λΉ„λ‹¨μˆœμ‹Έμ΄ν΄
    ( μœ„ κ·Έλž˜ν”„μ—μ„œ      κ²½λ‘œ )

 

πŸ“’  κ·Έλž˜ν”„ 속성

  •  n = 정점 수, m = κ°„μ„  수, deg(v) = 정점 v의 차수 μΌλ•Œ,
  • 속성 1

    πŸ‘‰ μ–΄λ–€ κ·Έλž˜ν”„μ˜ 차수(Degree) ν•© = 2m ( m = κ°„μ„ (edge)의 수 )

  • 속성 2

    πŸ‘‰ 루프와 병렬 간선이 μ—†λŠ” 무방ν–₯κ·Έλž˜ν”„μ—μ„œ,  m <= (n(n-1) )/2)

이런 κ·Έλž˜ν”„κ°€ μžˆμ„ 경우

  • μœ„μ™€ 같은 κ·Έλž˜ν”„κ°€ μžˆμ„ 경우 ( n = 4, m = 6, deg(v) = 3 )

    πŸ‘‰ μ΅œλŒ€ 6 <= (4(4-1)/2) κ°€ μ„±λ¦½ν•œλ‹€. 

 

πŸ“’  λΆ€κ·Έλž˜ν”„(Sub Graph)

  •  κ·Έλž˜ν”„ G = (V,E)의, λΆ€κ·Έλž˜ν”„(Sub Graph)λŠ” λ‹€μŒ 정점과 κ°„μ„ μœΌλ‘œ κ΅¬μ„±λœ κ·Έλž˜ν”„λ‹€.

    πŸ‘‰ 정점 : V의 뢀뢄집합
    πŸ‘‰ κ°„μ„  : E의 뢀뢄집합
  • κ·Έλž˜ν”„ G = (V,E)의, μ‹ μž₯λΆ€κ·Έλž˜ν”„(Spanning Subgraph)λŠ” λ‹€μŒ 정점과 κ°„μ„ μœΌλ‘œ κ΅¬μ„±λœ κ·Έλž˜ν”„λ‹€.

    πŸ‘‰ 정점 : V
    πŸ‘‰ κ°„μ„  : E의 뢀뢄집합

λΆ€κ·Έλž˜ν”„ μ˜ˆμ‹œ
μ‹ μž₯λΆ€κ·Έλž˜ν”„ μ˜ˆμ‹œ

 

πŸ“’  μ—°κ²°μ„±

  • λͺ¨λ“  μ •μ μŒμ— λŒ€ν•΄ κ²½λ‘œκ°€ μ‘΄μž¬ν•˜λ©΄, "κ·Έλž˜ν”„κ°€ μ—°κ²°(Connected)λ˜μ—ˆλ‹€."라고 λ§ν•œλ‹€.
  • κ·Έλž˜ν”„ G의 μ—°κ²°μš”μ†Œ(Connected Component) : G의 μ΅œλŒ€ μ—°κ²° λΆ€κ·Έλž˜ν”„

μ—°κ²°κ·Έλž˜ν”„ μ˜ˆμ‹œ
두 개의 μ—°κ²°μš”μ†Œ(Connected Component)둜 κ΅¬μ„±λœ λΉ„μ—°κ²°κ·Έλž˜ν”„ μ˜ˆμ‹œ

 

πŸ“’  밀집도

  • κ·Έλž˜ν”„ μ•Œκ³ λ¦¬μ¦˜μ˜ 선택은 μ’…μ’… κ°„μ„ μ˜ 밀집도에 따라 μ’Œμš°λœλ‹€.
  • μ˜ˆλ‘œλ“€μ–΄, 주어진 κ·Έλž˜ν”„ G에 λŒ€ν•΄, μ•Œκ³ λ¦¬μ¦˜ A,Bκ°€ λ™μΌν•œ 문제λ₯Ό 각각 O(NM)μ‹œκ°„κ³Ό O(N^2)μ‹œκ°„μ— ν•΄κ²°ν•  경우

    πŸ‘‰ Gκ°€ ν¬μ†Œν•˜λ‹€λ©΄, μ•Œκ³ λ¦¬μ¦˜ Aκ°€ B보닀 λΉ λ₯΄λ‹€.
    πŸ‘‰ Gκ°€ λ°€μ§‘ν•˜λ‹€λ©΄, μ•Œκ³ λ¦¬μ¦˜ Bκ°€ A보닀 λΉ λ₯΄λ‹€.

ν¬μ†Œκ·Έλž˜ν”„ μ˜ˆμ‹œ
λ°€μ§‘κ·Έλž˜ν”„ μ˜ˆμ‹œ

 

πŸ“’  싸이클

  • 자유트리(Free Tree), λ˜λŠ” 트리 : λ‹€μŒ 쑰건을 λ§Œμ‘±ν•˜λŠ” 무방ν–₯κ·Έλž˜ν”„ T

    πŸ‘‰ TλŠ” μ—°κ²°λ˜μ–΄μžˆλ‹€.
    πŸ‘‰ T에 싸이클이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.
    ❗❗ 자료ꡬ쑰의 "트리(Tree)"λž‘μ€ λ‹€λ₯Έ κ°œλ…μ΄λ‹€.

  • 숲(Forest) : 싸이클이 μ—†λŠ” 무방ν–₯κ·Έλž˜ν”„
  • 숲의 μ—°κ²°μš”μ†ŒλŠ” 트리"λ“€"이닀.

트리(Tree)의 μ˜ˆμ‹œ
숲(Forest)에 μ˜ˆμ‹œ

 

πŸ“’  μ‹ μž₯

  • μ—°κ²°κ·Έλž˜ν”„μ˜ μ‹ μž₯트리(Spanning Tree) : μ‹ μž₯ λΆ€κ·Έλž˜ν”„ κ°€μš΄λ° 트리인 것
  • μ‹ μž₯νŠΈλ¦¬λŠ” κ·Έλž˜ν”„κ°€ νŠΈλ¦¬κ°€ μ•„λ‹Œ ν•œ(즉, 싸이클이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” ν•œ), μœ μΌν•˜μ§€ μ•Šλ‹€.
  • μ‹ μž₯νŠΈλ¦¬λŠ” 톡신망 섀계에 μ‘μš©ν•œλ‹€.
  • κ·Έλž˜ν”„μ˜ μ‹ μž₯숲(Spanning Forest) : μ‹ μž₯ λΆ€κ·Έλž˜ν”„ κ°€μš΄λ° 숲인 것

이런 weight(κ°€μ€‘μΉ˜)κ°€ μžˆλŠ” κ·Έλž˜ν”„κ°€ μžˆμ„ 경우 (κ°€μ •)
이런 μ‹ μž₯νŠΈλ¦¬κ°€ 생성될 수 μžˆλ‹€. ( λͺ¨λ“  간선을 λ°©λ¬Έν•˜λŠ” 졜적의 경둜 )

 

πŸ“’  κ·Έλž˜ν”„ κ΅¬ν˜„

  • κ·Έλž˜ν”„ κ΅¬ν˜„μ—λŠ” 크게 3가지 ꡬ쑰둜 κ°€λŠ₯ν•˜λ‹€.

    πŸ‘‰ κ°„μ„ λ¦¬μŠ€νŠΈ(edge list)ꡬ쑰
    πŸ‘‰ μΈμ ‘λ¦¬μŠ€νŠΈ(adjacency list)ꡬ쑰
    πŸ‘‰ 인접행렬(adjacency matrix)ꡬ쑰
  • μΈμ ‘λ¦¬μŠ€νŠΈ κ΅¬μ‘°λŠ”

    πŸ‘‰ μ—°κ²°λ¦¬μŠ€νŠΈλ₯Ό μ΄μš©ν•œ κ΅¬ν˜„
    πŸ‘‰ 배열을 μ΄μš©ν•œ κ΅¬ν˜„

μ—°κ²°λ¦¬μŠ€νŠΈλ₯Ό μ΄μš©ν•œ μΈμ ‘λ¦¬μŠ€νŠΈ,인접행렬

  • 인접행렬 κ΅¬μ‘°λŠ”

    πŸ‘‰ μ—°κ²°λ¦¬μŠ€νŠΈλ₯Ό μ΄μš©ν•œ κ΅¬ν˜„
    πŸ‘‰ 배열을 μ΄μš©ν•œ κ΅¬ν˜„

배열을 μ΄μš©ν•œ μΈμ ‘λ¦¬μŠ€νŠΈ,인접행렬

 

πŸ“’  인접행렬(Adjacency Matrix)

  • N X N ν–‰λ ¬λ‘œ ν‘œν˜„
  • 무ν–₯ κ·Έλž˜ν”„μ˜ 경우

    πŸ‘‰ μ›μ†Œ(i,j) = 1 : 정점 i와 정점 j 사이에 간선이 μžˆλ‹€.
    πŸ‘‰ μ›μ†Œ(i,j) = 0 : 정점 i와 정점 j 사이에 간선이 μ—†λ‹€.

무ν–₯ κ·Έλž˜ν”„μ˜ 인접행렬은 연결성을 μ˜λ―Έν•œλ‹€. ( 1 = 연결됨, 0 = μ—°κ²°μ•ˆλ¨ )

  • 유ν–₯ κ·Έλž˜ν”„μ˜ 경우

    πŸ‘‰ μ›μ†Œ(i,j)λŠ” 정점 i λ‘œλΆ€ν„° 정점 j 둜 μ—°κ²°λ˜λŠ” 간선이 μžˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

유ν–₯ κ·Έλž˜ν”„μ—μ„œ 인접행렬 λ˜ν•œ 연결성을 의미( 1 = 연결됨, 0 = μ—°κ²° μ•ˆλ¨ )

  • κ°€μ€‘μΉ˜ μžˆλŠ” κ·Έλž˜ν”„μ˜ 경우

    πŸ‘‰ μ›μ†Œ(i,j)λŠ” 1 λŒ€μ‹ μ— κ°€μ€‘μΉ˜λ₯Ό 가진닀.

가쀑 κ·Έλž˜ν”„μ—μ„  μΈμ ‘ν–‰λ ¬μ˜ μš”μ†Œ 값은 "κ°€μ€‘μΉ˜" 의미
가쀑 κ·Έλž˜ν”„ λ‹€λ₯Έ μ˜ˆμ‹œ

 

πŸ“’  μΈμ ‘λ¦¬μŠ€νŠΈ(Adjacency List)

  • N 개의 μ—°κ²° 리슀트둜 ν‘œν˜„

    πŸ‘‰ i 번째 λ¦¬μŠ€νŠΈλŠ” 정점 i  에 μΈμ ‘ν•œ 정점듀을 리슀트둜 μ—°κ²°ν•΄ 놓은 것
  • κ°€μ€‘μΉ˜ μžˆλŠ” κ·Έλž˜ν”„μ˜ 경우

    πŸ‘‰ λ¦¬μŠ€νŠΈλŠ” κ°€μ€‘μΉ˜λ„ λ³΄κ΄€ν•œλ‹€.

무방ν–₯ κ·Έλž˜ν”„ μΈμ ‘λ¦¬μŠ€νŠΈ 예
κ°€μ€‘μΉ˜ κ·Έλž˜ν”„ μΈμ ‘λ¦¬μŠ€νŠΈ 예

 

πŸ“’  κ·Έλž˜ν”„ μ„±λŠ₯ & νŠΉμ§•

  • 점근적 μ„±λŠ₯ 비ꡐ
N 정점과 M κ°„μ„ 
병렬 κ°„μ„  μ—†μŒ
루프 μ—†μŒ
κ°„μ„ λ¦¬μŠ€νŠΈ μΈμ ‘λ¦¬μŠ€νŠΈ 인접행렬
곡간 N + M N + M N^2
incidentEdges(v) M deg(v) N
adjacentVertexs(v) M deg(v) N
areAdjacent(v,u) M min(deg(v),deg(u)) 1
insertVertex(o) 1 1 N
insertEdge(v,w,o) 1 1 1
removeVertex(v) M deg(v) N
removeEdge(e) 1 1 1
  • κ·Έλž˜ν”„ 상세 κ΅¬ν˜„ 비ꡐ
  μΈμ ‘λ¦¬μŠ€νŠΈ 인접행렬
μ—°κ²°λ¦¬μŠ€νŠΈ μ •μ λ¦¬μŠ€νŠΈ
κ°„μ„ λ¦¬μŠ€νŠΈ
동적메λͺ¨λ¦¬ λ…Έλ“œμ˜ μ—°κ²°λ¦¬μŠ€νŠΈ
정점,κ°„μ„  동적메λͺ¨λ¦¬ λ…Έλ“œ
인접 정보 ν¬μΈν„°μ˜ μ—°κ²°λ¦¬μŠ€νŠΈ 2D 포인터 λ°°μ—΄
μž₯점 동적 κ·Έλž˜ν”„μ— μ‚¬μš© μ‹œ 유리
단점 λ‹€μˆ˜μ˜ 포인터 μ‚¬μš©μœΌλ‘œ 볡작
λ°°μ—΄ μ •μ λ¦¬μŠ€νŠΈ
κ°„μ„ λ¦¬μŠ€νŠΈ
ꡬ쑰체 λ°°μ—΄
정점,κ°„μ„  ꡬ쑰체
인접 정보 첨자의 μ—°κ²°λ¦¬μŠ€νŠΈ 2D 첨자 λ°°μ—΄
μž₯점 λ‹€μˆ˜μ˜ 포인터λ₯Ό 첨자둜 λŒ€μ²΄ν•˜μ—¬ λ‹¨μˆœ
단점 동적 κ·Έλž˜ν”„μ— μ‚¬μš© μ‹œ 뢈리

 

πŸ“’  κ·Έλž˜ν”„ κ΅¬ν˜„ ADT

  • λ‹¨μˆœν•œν™”ν•œ 무방ν–₯κ·Έλž˜ν”„ ADT κ΅¬ν˜„

    πŸ‘‰ Integer deg(v) : 정점 v의 차수λ₯Ό λ°˜ν™˜
    πŸ‘‰ Integer opposite(v,e) : 정점 v와 κ°„μ„  e에 λŒ€ν•œ λ°˜λŒ€μͺ½ 끝점을 λ°˜ν™˜
    πŸ‘‰ Boolean areAdjcent(v,u) : 정점 v와 uκ°€ μΈμ ‘ν•œμ§€ μ—¬λΆ€λ₯Ό λ°˜ν™˜
    πŸ‘‰ Iterator adjacentVertex(v) : 정점 v의 인접정점을 λͺ¨λ‘ λ°˜ν™˜
    πŸ‘‰ Iterator incidentEdge(v) : 정점 v의 뢀착간선을 λͺ¨λ‘ λ°˜ν™˜
  • A. κ·Έλž˜ν”„κ°€ μΈμ ‘λ¦¬μŠ€νŠΈ ꡬ쑰둜 ν‘œν˜„λœλ‹€.
  • B. κ·Έλž˜ν”„κ°€ 인접행렬 ꡬ쑰둜 ν‘œν˜„λœλ‹€.
  • μ „μ œ

    πŸ‘‰ 인접행렬 κ΅¬μ‘°μ—μ„œ 인접행렬은 λ°°μ—΄ A에 μ €μž₯됬닀.
    πŸ‘‰ index(v) ν•¨μˆ˜ μ‚¬μš© κ°€λŠ₯ : μΈμ ‘ν–‰λ ¬μ—μ„œ 정점 v에 λŒ€μ‘ν•˜λŠ” λ°°μ—΄μ²¨μžλ₯Ό λ°˜ν™˜

차수 λ©”μ†Œλ“œ( deg(v) )

Alg deg(v)			// μΈμ ‘λ¦¬μŠ€νŠΈ 버전
	input vertex v
    output integer

c <- 0
e <- (v.incidentEdge).next

while(e != ∅)
	c <- c + 1
	e <- e.next
return c

// Total = O(deg(v))

======================================

Alg dev(v)			// 인접행렬 버전
	input adjacency matrix A, vertex v
	output integer

c <- 0
vi <- index(v)
for j <- 0 to n-1
	if(A[vi,j] != ∅)
		c <- c + 1
return c

// Total = O(n)

λ‚˜μ˜ μƒλŒ€λ°© 정점 λ°˜ν™˜ λ©”μ†Œλ“œ( opposite(v,e) )

Alg opposite(v,e)			// μΈμ ‘λ¦¬μŠ€νŠΈ 버전
	input vertex v, edge e
	output vertex

u,w <- e.endpoints
if(v == u)
	return w
else
	return u
    
// Total = O(1)

==========================

Alg opposite(v,e)			// 인접행렬 버전
	input adjacency matrix A, vertex v, edge e
	output vertex

u,w <- e.endpoints
if(v == u)
	return w
else
	return u

// Total = O(1)

정점 v,wκ°€ μΈμ ‘ν•œμ§€ 확인 λ©”μ†Œλ“œ( areAdjacent(v,w) )

Alg areAdjacent(v,w)		// μΈμ ‘λ¦¬μŠ€νŠΈ 버전
	input vertex v,w
	output boolean

if(deg(v) < deg(w))
	m <- v
else
	m <- w

e <- (m.incidentEdges).next
while(e != ∅)
	a,b <- e.endpoints
	if((v == a) && (w == b) || (v == b) && (w == a))
		return True
	e <- e.next
return False

// Total = O(min(deg(v),deg(w)))

=====================================================

Alg areAdjacent(v,w)		// 인접행렬 버전
	input adjacency matrix A, vertex v,w
	output integer

return A[index(v),index(w)] != ∅

// Total = O(1)

λ‚˜μ˜ μΈμ ‘ν•œ 정점 λ°˜ν™˜ λ©”μ†Œλ“œ( adjacentVertex(v) )

Alg adjacentVertex(v)		// μΈμ ‘λ¦¬μŠ€νŠΈ 버전
	input vertex v
	output set of vertex objects

L <- empty list
e <- (v.incidentEdges).next

while(e != ∅)
	L.addLast(opposite(v,e))
	e <- e.next
return L.element()

// Total = O(deg(v)) // μžκΈ°λž‘ μ—°κ²°λœ κ°„μ„ λ§Œ μ‘°μ‚¬ν•˜λ©΄ λ˜λ‹ˆκΉ

===================================

Alg adjacentVertex(v)		// 인접행렬 버젼
	input adjacency matrix A, vertex v
	output set of vertex objects

L <- empty list
vi <- index(v)

for j <- 0 to n - 1
	if(A[vi,j] != ∅)
		L.addLast(opposite(v,A[vi,j]))
return L.element()

// Total = O(n)		// λ‚˜λ₯Ό μ œμ™Έν•œ λͺ¨λ“  정점에 λŒ€ν•΄, μ—°κ²°λ˜μ–΄ μžˆλŠ”μ§€ ν•˜λ‚˜μ”© μ‘°μ‚¬ν•΄μ•Όλ˜λ‹ˆκΉ

λ‚˜μ˜ λΆ€μ°©κ°„μ„  λ°˜ν™˜ λ©”μ†Œλ“œ( incidentEdges(v) )

Alg incidentEdges(v)		// μΈμ ‘λ¦¬μŠ€νŠΈ 버젼
	input vertex v
	output set of edge objects

L <- empty list
e <- (v.incidentEdges).next

while(e != ∅)
	L.addLast(e)
	e <- e.next
return L.element()

// Total = O(deg(v))		// λ‚˜ν•œν…Œ λΆ€μ°©λœ μ—°κ²°λ¦¬μŠ€νŠΈλ§Œ ν™•μΈν•˜λ©΄ λ˜λ‹ˆκΉ

=================================

Alg incidentEdges(v)		// 인접행렬 버젼
	input adjacency matrix A, vertex v
	output set of edge objects

L <- empty list
vi <- index(v)

for j <- 0 to n - 1
	if(A[vi,j] != ∅)
		L.addLast(A[vi,j])
return L.elements()

// Total = O(n)			// λ‚˜λ₯Ό μ œμ™Έν•œ λͺ¨λ“  정점에 λŒ€ν•΄ λΆ€μ°©λ¬λŠ”μ§€ ν™•μΈν•΄μ•Όλ˜λ‹ˆκΉ

 

πŸ“’  λ²ˆμ™Έ

  •  κ·Έλž˜ν”„ κ΅¬ν˜„ 방식 선택 : λ‹€μŒ 각 κ²½μš°μ— μΈμ ‘λ¦¬μŠ€νŠΈ ꡬ쑰와 인접행렬 ꡬ쑰 λ‘˜ 쀑 μ–΄λŠ 것을 μ‚¬μš©ν•˜κ² λŠ”κ°€ ?

    πŸ‘‰ a. κ·Έλž˜ν”„κ°€ 10,000개의 정점과 20,000개의 간선을 가지며, κ°€λŠ₯ν•œ μ΅œμ†Œν•œμ˜ 곡간 μ‚¬μš©μ΄ μ€‘μš”
    πŸ‘‰ b. κ·Έλž˜ν”„κ°€ 10,000개의 정점과 20,000,000개의 간선을 가지며 κ°€λŠ₯ν•œ μ΅œμ†Œν•œμ˜ 곡간 μ‚¬μš©μ΄ μ€‘μš”
    πŸ‘‰ c. μ–Όλ§ˆμ˜ 곡간을 μ‚¬μš©ν•˜λ“ , areAdjacent μ§ˆμ˜μ— κ°€λŠ₯ν•œ 빨리 λ‹΅ν•΄μ•Ό ν•  경우

  • ν•΄κ²°μ±…

    πŸ‘‰ a. μΈμ ‘λ¦¬μŠ€νŠΈ ꡬ쑰가 유리 = 싀상 인접행렬 ꡬ쑰λ₯Ό μ“΄λ‹€λ©΄ λ§Žμ€ 곡간을 λ‚­λΉ„ν•œλ‹€. μ™œλƒλ©΄ 20,000개의 κ°„μ„ λ§Œμ΄ μ‘΄μž¬ν•˜λŠ”λ°λ„ 100,000,000개의 간선에 λŒ€ν•œ 곡간을 ν• λ‹Ήν•˜κΈ°λ•Œλ¬Έ ( M <= (N(N-1)/2 )
    πŸ‘‰ b. 일반적으둜, 이 κ²½μš°μ—λŠ” μ–‘μͺ½ ꡬ쑰 λͺ¨λ‘κ°€ 적합 = areAdjacent μž‘μ—…μ€ 인접행렬 ꡬ쑰가 유리, insertVertex와 removeVertex μž‘μ—…μ—μ„œλŠ” μΈμ ‘λ¦¬μŠ€νŠΈ ꡬ쑰가 유리
    πŸ‘‰ c. 인접행렬 ꡬ쑰가 유리 = μ΄μœ λŠ”, 이 ꡬ쑰가 areAdjacentμž‘μ—…μ„ μ •μ μ΄λ‚˜ κ°„μ„ μ˜ κ°œμˆ˜μ— 관계없이 O(1)μ‹œκ°„μ— μ§€μ›ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

  • O(log M) == O(log N)인 이유 ( M = κ°„μ„  수, N = 정점 수 )

    πŸ‘‰ Gλ₯Ό N 개의 정점과 M 개의 κ°„μ„ μœΌλ‘œ 이뀄진 λ‹¨μˆœ μ—°κ²°κ·Έλž˜ν”„λΌ κ°€μ •ν•˜μž.
    πŸ‘‰ M <= N(N-1)/2 이며, μ΄λŠ” O(N^2)이닀.
    πŸ‘‰ λ”°λΌμ„œ, O(log M) == O(log N^2) == O(2log N) == O(log N) 이닀.
728x90
λ°˜μ‘ν˜•

+ Recent posts