Topological Sort
- μμ μ λ ¬μ΄λ 무μμΈκ°?
- μμ μ λ ¬ μκ³ λ¦¬μ¦ κ΅¬ννκΈ°
1. Topology
- μ§μμ μΈ λ³ν(λμ΄λ¨, λΉνλ¦Ό, ꡬ겨μ§, κ΅½ν)νμ 보쑴λλ κΈ°ννμ νΉμ±κ³Ό κ΄λ ¨λλ μνμ ν λΆμΌ
- λͺ¨λ μ’ λ₯μ μ°μμ±μ μ μν μ μλ ꡬ쑰
2. Topological Sort
- λ°λΌμ μμ μ λ ¬Topological Sortμ΄λ, μ λ ¬ μ€μ μ°μμ±, μ°κ²°μ΄λΌλ μμ±μ μ λ ¬
- EX)
- λνκ΅ μ μκ³Όλͺ© (Bκ³Όλͺ©μ κ·Έλ₯ μκ° κ°λ₯νμ§λ§, Aκ³Όλͺ©μ Bκ³Όλͺ© μκ° μ΄νμλ§ μκ° κ°λ₯νλ€.)
- μ€κΈ νκ³λ νκ³μ리λ₯Ό μκ°ν νμλ§ μκ° κ°λ₯
- μκ³ λ¦¬μ¦μ C μΈμ΄λ₯Ό μκ°ν νμλ§ μκ° κ°λ₯ (?)
- λνκ΅ μ μκ³Όλͺ© (Bκ³Όλͺ©μ κ·Έλ₯ μκ° κ°λ₯νμ§λ§, Aκ³Όλͺ©μ Bκ³Όλͺ© μκ° μ΄νμλ§ μκ° κ°λ₯νλ€.)
3. DAG
- μμ μ λ ¬μ΄ λκΈ°μν 쑰건
- Direct Acycle Graph
- λ°©ν₯μ΄ μλ€
- μΈμ΄ν΄μ΄ μλ€
- λ°©ν₯μ μμΌλ©°, μΈμ΄ν΄μ΄ μλ κ·Έλν
4. Kylieμ ν루
- κ°μ₯ λ¨Όμ μΆκ·Όμ ν©λλ€.
- λ§μ§λ§μ ν΄κ·Όμ νκ³ μ§μ λμ°©ν©λλ€.
- ν΄κ·Όμ νκΈ° μ μλ μΌμ ν©λλ€.
- μΌμ νκΈ° μν΄μ κ΅¬κΈ λ‘κ·ΈμΈμ΄ νμνκ³ , κ΅¬κΈ λ‘κ·ΈμΈμ μ»΄ν¨ν°λ₯Ό μΌμΌ κ°λ₯ν©λλ€.
- ν΄κ·Ό νκΈ° μ μ μ‘λ΄λ ν©λλ€.
- μΉ΄μΌλ¦¬μ ν루λ₯Ό μμ μ λ ¬μΌλ‘ λνλ΄κΈ°
- μΆκ·ΌνκΈ° β μ»΄ν¨ν° ν€κΈ° β λ‘κ·ΈμΈ νκΈ° β μΌνκΈ° β μ‘λ΄νκΈ° β ν΄κ·ΌνκΈ° β μ§μ λμ°©
- μΆκ·ΌνκΈ° β μ»΄ν¨ν° ν€κΈ° β λ‘κ·ΈμΈ νκΈ° β μ‘λ΄νκΈ° β μΌνκΈ° β ν΄κ·ΌνκΈ° β μ§μ λμ°©
- μΆκ·ΌνκΈ° β μ‘λ΄νκΈ° β μ»΄ν¨ν° ν€κΈ° β λ‘κ·ΈμΈ νκΈ° β μΌνκΈ° β ν΄κ·ΌνκΈ° β μ§μ λμ°©
5. μμ μ λ ¬ μκ³ λ¦¬μ¦ κ΅¬ννκΈ°
Stack
- LIFO(Last In First Out)
- μμ μ λ ¬μ μμνκΈ° μ μ κ° μ μ (vertex)μ μ§μ μ°¨μ(in-degree) μ 보λ₯Ό μ μ₯νλ€.
- μ§μ μ°¨μ(in-dgree)κ° 0μΈ μ μ (vertex)μ μ€νμ μ½μ νλ€.
- μ€νμ λ€μ΄ μλ κ²μ popμΌλ‘ κΊΌλ΄κ³ , ν΄λΉ λ Έλμμ κ° μ μλ λ Έλμ μ§μ μ°¨μλ₯Ό 1 κ°μ μν€κ³ , μ§μ μ°¨μκ° 0μ΄λΌλ©΄ ν΄λΉ λ Έλλ₯Ό μ€νμ λ£λλ€.
- μ€νμ΄ λΉμ΄μ§λ κΉμ§ 3λ² κ³Όμ μ λ°λ³΅νλ€.
- λ§μ½ λͺ¨λ μμ(μ μ , λ Έλ)λ₯Ό λ°©λ¬ΈνκΈ° μ μ μ€νμ΄ λΉλ€λ©΄ μ¬μ΄ν΄μ΄ μ‘΄μ¬νλ κ²μ΄κ³
- λͺ¨λ μμλ₯Ό λ°λνλ€λ©΄ μ€νμμ κΊΌλΈ μ«μκ° μμ μ λ ¬μ κ²°κ³Όκ° λλ€.
Queue
- FIFO(First In Fist Out)
Operation (μ°μ°)
class DAG:
def __init__(self, vertex_num):
self.adj_list = [[] for _ in range(vertex_num)]
self.visited = [False for _ in range(vertex_num)]
def add_edge(self, u, v):
# u : tail, v : head
self.adj_list[u].append(v)
def topological_sort(self):
# μμ μ λ ¬μ λ΄λΉνλ λ©μλ
self.init_visited()
ts_list = []
for i in range(len(self.visited)):
if not self.visited[i]:
self.dfs(i, ts_list)
ts_list.reverse()
return ts_list
def init_visited(self):
for i in range(len(self.visited)):
self.visited[i] = False
def dfs(self, v, ts_list):
self.visited[v] = True
adj_v = self.adj_list[v]
for u in adj_v:
if not self.visited[u]:
self.dfs(u, ts_list)
ts_list.append(v)
if __name__ == "__main__":
d = DAG(7)
d.add_edge(0, 1)
d.add_edge(0, 4)
d.add_edge(1, 2)
d.add_edge(2, 3)
d.add_edge(3, 5)
d.add_edge(4, 5)
d.add_edge(5, 6)
ts_list = d.topological_sort()
for i in ts_list:
print(i, end=" ")
0 4 1 2 3 5 6
μμ μ λ ¬μ μ΄λμ μ°μ΄λμ?
- μ€νλ λ μνΈμμ μ΄λ€ μ κ°μ΄ λ³κ²½ λμμ λ, μ΄ κ°μ΄ μμ‘΄νλ λͺ¨λ μ κ°μ μ λ°μ΄νΈ ν λ μ°μΈλ€κ³ ν©λλ€.