π’ κ·Έλν(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μ μ΅λ μ°κ²° λΆκ·Έλν
π’ λ°μ§λ
- κ·Έλν μκ³ λ¦¬μ¦μ μ νμ μ’ μ’ κ°μ μ λ°μ§λμ λ°λΌ μ’μ°λλ€.
- μλ‘λ€μ΄, μ£Όμ΄μ§ κ·Έλν Gμ λν΄, μκ³ λ¦¬μ¦ A,Bκ° λμΌν λ¬Έμ λ₯Ό κ°κ° O(NM)μκ°κ³Ό O(N^2)μκ°μ ν΄κ²°ν κ²½μ°
π Gκ° ν¬μνλ€λ©΄, μκ³ λ¦¬μ¦ Aκ° Bλ³΄λ€ λΉ λ₯΄λ€.
π Gκ° λ°μ§νλ€λ©΄, μκ³ λ¦¬μ¦ Bκ° Aλ³΄λ€ λΉ λ₯΄λ€.
π’ μΈμ΄ν΄
- μμ νΈλ¦¬(Free Tree), λλ νΈλ¦¬ : λ€μ 쑰건μ λ§μ‘±νλ 무방ν₯κ·Έλν T
π Tλ μ°κ²°λμ΄μλ€.
π Tμ μΈμ΄ν΄μ΄ μ‘΄μ¬νμ§ μλλ€.
ββ μλ£κ΅¬μ‘°μ "νΈλ¦¬(Tree)"λμ λ€λ₯Έ κ°λ μ΄λ€. - μ²(Forest) : μΈμ΄ν΄μ΄ μλ 무방ν₯κ·Έλν
- μ²μ μ°κ²°μμλ νΈλ¦¬"λ€"μ΄λ€.
π’ μ μ₯
- μ°κ²°κ·Έλνμ μ μ₯νΈλ¦¬(Spanning Tree) : μ μ₯ λΆκ·Έλν κ°μ΄λ° νΈλ¦¬μΈ κ²
- μ μ₯νΈλ¦¬λ κ·Έλνκ° νΈλ¦¬κ° μλ ν(μ¦, μΈμ΄ν΄μ΄ μ‘΄μ¬νμ§ μλ ν), μ μΌνμ§ μλ€.
- μ μ₯νΈλ¦¬λ ν΅μ λ§ μ€κ³μ μμ©νλ€.
- κ·Έλνμ μ μ₯μ²(Spanning Forest) : μ μ₯ λΆκ·Έλν κ°μ΄λ° μ²μΈ κ²
π’ κ·Έλν ꡬν
- κ·Έλν ꡬνμλ ν¬κ² 3κ°μ§ κ΅¬μ‘°λ‘ κ°λ₯νλ€.
π κ°μ 리μ€νΈ(edge list)ꡬ쑰
π μΈμ 리μ€νΈ(adjacency list)ꡬ쑰
π μΈμ νλ ¬(adjacency matrix)ꡬ쑰 - μΈμ 리μ€νΈ ꡬ쑰λ
π μ°κ²°λ¦¬μ€νΈλ₯Ό μ΄μ©ν ꡬν
π λ°°μ΄μ μ΄μ©ν ꡬν
- μΈμ νλ ¬ ꡬ쑰λ
π μ°κ²°λ¦¬μ€νΈλ₯Ό μ΄μ©ν ꡬν
π λ°°μ΄μ μ΄μ©ν ꡬν
π’ μΈμ νλ ¬(Adjacency Matrix)
- N X N νλ ¬λ‘ νν
- 무ν₯ κ·Έλνμ κ²½μ°
π μμ(i,j) = 1 : μ μ iμ μ μ j μ¬μ΄μ κ°μ μ΄ μλ€.
π μμ(i,j) = 0 : μ μ iμ μ μ j μ¬μ΄μ κ°μ μ΄ μλ€.
- μ ν₯ κ·Έλνμ κ²½μ°
π μμ(i,j)λ μ μ i λ‘λΆν° μ μ j λ‘ μ°κ²°λλ κ°μ μ΄ μλμ§λ₯Ό λνλΈλ€.
- κ°μ€μΉ μλ κ·Έλνμ κ²½μ°
π μμ(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
λ°μν
'Algorithm Theory' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
λ°©ν₯ κ·Έλν(Directed graph) (0) | 2020.12.14 |
---|---|
κ·Έλν μν(Graph Traversal) (0) | 2020.12.14 |
ν΄μν μ΄λΈ(Hash Table) (0) | 2020.12.13 |
μ΄μ§νμνΈλ¦¬(Binary Search Tree) (0) | 2020.12.12 |
μ¬μ (Dictionary) (0) | 2020.12.12 |