Topological Sort

  • μœ„μƒ μ •λ ¬μ΄λž€ 무엇인가?
  • μœ„μƒ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„ν•˜κΈ°

1. Topology

  • 지속적인 λ³€ν˜•(λŠ˜μ–΄λ‚¨, λΉ„ν‹€λ¦Ό, ꡬ겨짐, ꡽힘)ν•˜μ— λ³΄μ‘΄λ˜λŠ” κΈ°ν•˜ν•™μ  νŠΉμ„±κ³Ό κ΄€λ ¨λ˜λŠ” μˆ˜ν•™μ˜ ν•œ λΆ„μ•Ό
  • λͺ¨λ“  μ’…λ₯˜μ˜ 연속성을 μ •μ˜ν•  수 μžˆλŠ” ꡬ쑰

2. Topological Sort

  • λ”°λΌμ„œ μœ„μƒ μ •λ ¬Topological Sortμ΄λž€, μ •λ ¬ 쀑에 연속성, μ—°κ²°μ΄λΌλŠ” μ†μ„±μ˜ μ •λ ¬
  • EX)
    • λŒ€ν•™κ΅ μ„ μˆ˜κ³Όλͺ© (Bκ³Όλͺ©μ€ κ·Έλƒ₯ μˆ˜κ°• κ°€λŠ₯ν•˜μ§€λ§Œ, Aκ³Όλͺ©μ€ Bκ³Όλͺ© μˆ˜κ°• μ΄ν›„μ—λ§Œ μˆ˜κ°• κ°€λŠ₯ν•˜λ‹€.)
      • 쀑급 νšŒκ³„λŠ” νšŒκ³„μ›λ¦¬λ₯Ό μˆ˜κ°•ν•œ ν•™μƒλ§Œ μˆ˜κ°• κ°€λŠ₯
      • μ•Œκ³ λ¦¬μ¦˜μ€ C μ–Έμ–΄λ₯Ό μˆ˜κ°•ν•œ ν•™μƒλ§Œ μˆ˜κ°• κ°€λŠ₯ (?)

3. DAG

  • μœ„μƒ 정렬이 λ˜κΈ°μœ„ν•œ 쑰건
    • Direct Acycle Graph
    • λ°©ν–₯이 μžˆλ‹€
    • 싸이클이 μ—†λ‹€
    • λ°©ν–₯은 있으며, 싸이클이 μ—†λŠ” κ·Έλž˜ν”„

4. Kylie의 ν•˜λ£¨

  • κ°€μž₯ λ¨Όμ € μΆœκ·Όμ„ ν•©λ‹ˆλ‹€.
  • λ§ˆμ§€λ§‰μ€ 퇴근을 ν•˜κ³  집에 λ„μ°©ν•©λ‹ˆλ‹€.
  • 퇴근을 ν•˜κΈ° μ „μ—λŠ” 일을 ν•©λ‹ˆλ‹€.
  • 일을 ν•˜κΈ° μœ„ν•΄μ„  ꡬ글 둜그인이 ν•„μš”ν•˜κ³ , ꡬ글 λ‘œκ·ΈμΈμ€ 컴퓨터λ₯Ό μΌœμ•Ό κ°€λŠ₯ν•©λ‹ˆλ‹€.
  • 퇴근 ν•˜κΈ° 전에 μž‘λ‹΄λ„ ν•©λ‹ˆλ‹€.
  • 카일리의 ν•˜λ£¨λ₯Ό μœ„μƒ μ •λ ¬μœΌλ‘œ λ‚˜νƒ€λ‚΄κΈ°
    • μΆœκ·Όν•˜κΈ° β†’ 컴퓨터 ν‚€κΈ° β†’ 둜그인 ν•˜κΈ° β†’ μΌν•˜κΈ° β†’ μž‘λ‹΄ν•˜κΈ° β†’ ν‡΄κ·Όν•˜κΈ° β†’ 집에 도착
    • μΆœκ·Όν•˜κΈ° β†’ 컴퓨터 ν‚€κΈ° β†’ 둜그인 ν•˜κΈ° β†’ μž‘λ‹΄ν•˜κΈ° β†’ μΌν•˜κΈ° β†’ ν‡΄κ·Όν•˜κΈ° β†’ 집에 도착
    • μΆœκ·Όν•˜κΈ° β†’ μž‘λ‹΄ν•˜κΈ° β†’ 컴퓨터 ν‚€κΈ° β†’ 둜그인 ν•˜κΈ° β†’ μΌν•˜κΈ° β†’ ν‡΄κ·Όν•˜κΈ° β†’ 집에 도착

5. μœ„μƒ μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜ κ΅¬ν˜„ν•˜κΈ°

Stack

  • LIFO(Last In First Out)
    1. μœ„μƒ 정렬을 μ‹œμž‘ν•˜κΈ° 전에 각 정점(vertex)와 μ§„μž… 차수(in-degree) 정보λ₯Ό μ €μž₯ν•œλ‹€.
    2. μ§„μž… 차수(in-dgree)κ°€ 0인 정점(vertex)을 μŠ€νƒμ— μ‚½μž…ν•œλ‹€.
    3. μŠ€νƒμ— λ“€μ–΄ μžˆλŠ” 것을 pop으둜 κΊΌλ‚΄κ³ , ν•΄λ‹Ή λ…Έλ“œμ—μ„œ 갈 수 μžˆλŠ” λ…Έλ“œμ˜ μ§„μž…μ°¨μˆ˜λ₯Ό 1 κ°μ†Œ μ‹œν‚€κ³ , μ§„μž… μ°¨μˆ˜κ°€ 0이라면 ν•΄λ‹Ή λ…Έλ“œλ₯Ό μŠ€νƒμ— λ„£λŠ”λ‹€.
    4. μŠ€νƒμ΄ λΉ„μ–΄μ§ˆλ•Œ κΉŒμ§€ 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

μœ„μƒ 정렬은 어디에 μ“°μ΄λ‚˜μš”?

  • μŠ€ν”„λ ˆλ“œ μ‹œνŠΈμ—μ„œ μ–΄λ–€ μ…€ 값이 λ³€κ²½ λ˜μ—ˆμ„ λ•Œ, 이 값이 μ˜μ‘΄ν•˜λŠ” λͺ¨λ“  μ…€ 값을 μ—…λ°μ΄νŠΈ ν•  λ•Œ 쓰인닀고 ν•©λ‹ˆλ‹€.