1 minute read

Categories:

Tags: , , , ,

Example of topological sort

μ–΄λ–€ μ—°μ†μ μ΄μ§€λ§Œ νŠΉμ •ν•œ μˆœμ„œκ°€ μžˆλŠ” ν…ŒμŠ€ν¬λ“€μ— μš°λ¦¬λŠ” topological sortλ₯Ό μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Όλ“€λ©΄ μ˜·μ„ μž…κ³  학ꡐλ₯Ό κ°€λŠ”κ²ƒμ„ μ˜ˆμ œλ‘œλ“€μžλ©΄ 1 μ…”μΈ , μ†μ˜·, 양말쀑 어떀것을 λ¨Όμ € μž…λŠλƒλŠ” μ€‘μš”ν•˜μ§€ μ•Šμ§€λ§Œ 바지λ₯Ό μž…κΈ°μ „μ— μ†μ˜·μ„ μž…λŠ”λ‹€λ˜μ§€ μ•„λ‹˜ 양말을 μ‹ κΈ°μ „ μ‹ λ°œμ„ μ‹ λŠ” 행동듀은 μ΄μƒν•œ κ²°κ³Όλ₯Ό κ°€μ Έμ˜¬κ²ƒ μž…λ‹ˆλ‹€. λ”°λΌμ„œ 결과적으둜 μœ μΌν•˜μ§„(unique) μ•Šμ§€λ§Œ νŠΉμ •ν•œ μˆœμ„œκ°€ μ‘΄μž¬ν•˜λŠ”κ²ƒμ€ λΆ„λͺ…ν•˜κ³  μœ„μ˜ˆμ œμ—μ„œ κ°€λŠ₯ν•œ topological ordering은 λ‹€μŒκ³Ό 같을 κ²ƒμž…λ‹ˆλ‹€. 1

λ‹€μˆ˜μ˜ λ§Žμ€ 상황듀이 μœ„μ˜ˆμ œμ™€ 같이 λ°©ν–₯κ·Έλž˜ν”„(directed graph)λ₯Ό μ‚¬μš©ν•˜μ—¬ ν‘œν˜„λ  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Όλ“€λ©΄, program build dependencies, college class prerequisites, event scheduling, assembly instruction 등이 μœ„μƒμ •λ ¬μ„ 톡해 ν‘œν˜„λ  수 μžˆμ„κ²ƒ μž…λ‹ˆλ‹€.

μ •μ˜

μœ„μƒμ •λ ¬μ΄λž€ λ°©ν–₯κ·Έλž˜ν”„μ˜ λ…Έλ“œμ— λŒ€ν•œ μ •λ ¬μž…λ‹ˆλ‹€.

λŒ€ν‘œμ μœΌλ‘  Kahn’s algorithm이 있고 이λ₯Ό μˆ˜ν–‰ν•˜μ˜€μ„κ²½μš° O(V+E) μ‹œκ°„λ³΅μž‘λ„μ•ˆμ— μœ„μƒμ •λ ¬μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ£Όμœ„ν•΄μ•Όν•  λ‚΄μš©μœΌλ‘  μœ„μƒμ •λ ¬μ€ κ³ μœ ν•œ 값을 가지고 μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λŠ” λ‹€μ–‘ν•œ 결과값이 μ‘΄μž¬ν•  수 μžˆλ‹€λŠ”κ²ƒμ„ μ•Œλ €μ€λ‹ˆλ‹€.

쑰건

λͺ¨λ“  κ·Έλž˜ν”„λ¬Έμ œκ°€ μœ„μƒμ •λ ¬λ¬Έμ œμ— μ ν•©ν•˜μ§„ μ•ŠμŠ΅λ‹ˆλ‹€. 였둜직 DAGs(directed acyclic graphs)만이 μ •ν™•ν•œ κ²°κ³Ό 값을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. 즉 λ°©ν–₯κ·Έλž˜ν”„μ΄λ©΄μ„œ 사이클이 없을떄 κ°€λŠ₯ν•©λ‹ˆλ‹€.

Kahn’s algorithm

μ „λ°˜μ μΈ μ•Œκ³ λ¦¬μ¦˜μ€ μš°μ„  반볡적으둜 λ‹€λ₯Έν•˜λ‚˜μ— μ’…μ†λ˜μ§€ μ•Šμ€ λ…Έλ“œλ“€μ„ κ·Έλž˜ν”„μ—μ„œ μ œκ±°ν•œν›„ 결과값에 μΆ”κ°€ν•΄μ£ΌλŠ” κ²ƒμž…λ‹ˆλ‹€.

예제λ₯Ό ν•˜λ‚˜ λ³΄κ² μŠ΅λ‹ˆλ‹€. 1

독립적인 λ…Έλ“œλž€, λ…Έλ“œμ— λ“€μ–΄μ˜€λŠ” in-orderκ°€ 0μ΄λž€ 말과 λΉ„μŠ·ν•©λ‹ˆλ‹€. κ·Έλž˜ν”„μ— 이와 같은 λ…Έλ“œλ“€μ„ 찾은후에 μ „λΆ€ 큐에 λ„£μ–΄μ€λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ κ°€μž₯λ¨Όμ € λ…Έλ“œ 2κ°€ 큐에 λ“€μ–΄μ˜¬ κ²ƒμž…λ‹ˆλ‹€. 이λ₯Ό κ·Έλž˜ν”„μ—μ„œ μ œκ±°ν•œν›„ 기쑴에 μ’…μ†λ˜μ—ˆλ˜ λ…Έλ“œ0κ³Ό λ…Έλ“œ4에 λŒ€ν•΄μ„œλ„ κ²°κ³Όλ₯Ό λ°˜μ˜ν•΄μ€λ‹ˆλ‹€. 그리고 λ§Œμ•½ λ…Έλ“œ 0κ³Ό 4κ°€ μ΄λ‘œμΈν•΄ 독립적인 λ…Έλ“œκ°€ λ˜μ—ˆλ‹€λ©΄ 이λ₯Ό λ‹€μ‹œ 큐에 λ„£μ–΄μ£ΌλŠ” ν˜•μ‹μœΌλ‘œ λ°˜λ³΅ν•©λ‹ˆλ‹€. 이λ₯Ό μˆ˜ν–‰ν–ˆμ„κ²½ν›„ ν•˜λ‚˜μ˜ κ°€λŠ₯ν•œ μœ„μƒμ •λ ¬μ€ [2, 0, 4, 3, 5, 1] μž…λ‹ˆλ‹€.

μ½”λ“œ

vector<int> FindTopologicalOrdering(g)
{
    // κ·Έλž˜ν”„μ˜ κ°λ…Έλ“œμ— λŒ€ν•΄ inorderλ₯Ό 계산함
    n = g.size();
    vector<int> in_degree(n);
    for(int i=0; i<n; ++i)
    {
        for(auto& to : g[i])
        {
            in_degree[to] = in_degree[to] + 1;
        }
    }

    //μΈμ˜€λ”μ˜ 값이 0인 경우 즉 독립적인 λ…Έλ“œλ§Œ 큐에 λ„£μ–΄μ€€λ‹€
    queue<int> q;
    for(int i =0; i<n; ++i)
    {
        if(in_degree[i] == 0)
        {
            q.push(i);
        }
    }

    /*
        1. 큐λ₯Ό ν™•μΈν•˜μ—¬ 독립적인 λ…Έλ“œλ“€μ— λŒ€ν•΄ μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.
        2. ν•΄λ‹Ήλ…Έλ“œλ₯Ό 결과에 μΆ”κ°€μ‹œν‚¨λ‹€.
        3. 기쑴에 ν•΄λ‹Ήλ…Έλ“œμ— μ’…μ†λ°›μ•˜λ˜ λ…Έλ“œλ“€μ˜ μΈμ˜€λ” 값을 μ œκ±°ν•΄μ€€λ‹€
        4. 더이상 μ’…μ†λ˜μ§€ μ•Šμ€ λ…Έλ“œλ“€μ€ 큐에 μΆ”κ°€ν•΄μ€€λ‹€.
        이λ₯Ό λ°˜λ³΅ν•œλ‹€.
    */
    int index = 0;
    vector<int> order(n);
    while(!q.empty())
    {
        int at = q.front();
        q.pop();
        order[index++] = at;
        for(auto to:g[at])
        {
            in_degree[to] = in_degree[to]-1;
            if(in_degree[to] == 0)
            {
                q.push(to);
            }
        }
    }

    // index 값이 λ…Έλ“œμ˜ μˆ˜μ™€ 같지 μ•Šλ‹€λŠ”κ²ƒμ€ 사이클이 μ‘΄μž¬ν•œλ‹€λŠ”κ²ƒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.
    // λ§Œμ•½ A->B->C->A 의 κ·Έλž˜ν”„κ°€ μžˆλ‹€κ³  κ°€μ •ν–ˆμ„ 경우 μ–΄λ– ν•œ λ…Έλ“œλ…Έ 큐에 μΆ”κ°€λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 인덱슀 값을 n이 될 수 μ—†μŠ΅λ‹ˆλ‹€.
    if(index != n)
    {
        return NULL;
    }
    return order; 
}

Reference

  1. 이 λ…ΈνŠΈλŠ” topological sortλ₯Ό μ°Έκ³  ν–ˆμŠ΅λ‹ˆλ‹€.

Leave a comment