Menu
CoddyTech

Topological Sort

Terakhir diperbarui

Topological sort pada directed acyclic graph (DAG) adalah urutan linear dari node-node-nya sehingga untuk setiap edge u → v, u muncul sebelum v. Topological sort menjawab pertanyaan seperti "dalam urutan apa tugas-tugas ini bisa dijalankan agar setiap prasyaratnya selesai lebih dulu?" Tekan Putar di atas untuk melihat algoritma Kahn melepaskan node satu per satu dalam urutan yang valid.

Algoritma Kahn berulang kali mengambil node yang tidak punya edge masuk tersisa (indegree 0), menambahkannya ke urutan, lalu menghapus edge keluarnya, yang mungkin membuat node lain menjadi indegree 0. Algoritma ini hanya bekerja pada DAG: jika ada siklus, beberapa node tidak pernah mencapai indegree 0 dan tidak ada urutan yang valid. Algoritma ini berjalan dalam waktu O(V + E).

Kompleksitas waktu dan ruang

UkuranKompleksitasCatatan
WaktuO(V + E)Setiap node dikeluarkan sekali, setiap edge dihapus sekali
RuangO(V)Hitungan indegree + himpunan siap + urutan
MembutuhkanSebuah DAGSiklus tidak punya urutan topologis
HasilTidak unikBisa ada banyak urutan yang valid

Langkah demi langkah (algoritma Kahn)

LangkahApa yang terjadi
1Hitung indegree (jumlah edge masuk) setiap node.
2Kumpulkan semua node dengan indegree 0 ke dalam himpunan siap.
3Ambil satu node yang siap, tambahkan ke urutan output.
4Kurangi indegree setiap node penerusnya.
5Setiap node penerus yang mencapai indegree 0 masuk ke himpunan siap.
6Ulangi sampai himpunan siap kosong.

Contoh penerapan

Mengurutkan DAG dengan edge A→C, B→C, C→D, C→E, D→F, E→F (indegree awal A:0 B:0 C:2 D:1 E:1 F:2):

LangkahHimpunan siapUrutanAksi
0{A, B}[]A dan B dimulai dengan indegree 0, jadi keduanya siap.
1{B}[A]Keluarkan A; edge A→C menurunkan indegree C dari 2 → 1.
2{C}[A, B]Keluarkan B; edge B→C menurunkan C dari 1 → 0, jadi C menjadi siap.
3{D, E}[A, B, C]Keluarkan C; edge C→D dan C→E menurunkan D dan E menjadi 0, keduanya menjadi siap.
4{E}[A, B, C, D]Keluarkan D; edge D→F menurunkan indegree F dari 2 → 1.
5{F}[A, B, C, D, E]Keluarkan E; edge E→F menurunkan F dari 1 → 0, jadi F menjadi siap.
6{}[A, B, C, D, E, F]Keluarkan F; himpunan siap kosong dan keenam node sudah terurut: selesai.

Kapan memakai topological sort

Pakai saatHindari saat
Kamu butuh urutan yang menghormati ketergantungan (langkah build, instalasi paket, prasyarat mata kuliah).Grafnya tidak berarah: urutan topologis hanya terdefinisi untuk graf berarah.
Grafnya adalah DAG dan kamu ingin satu urutan linear yang valid, apa pun itu.Grafnya mungkin berisi siklus dan kamu tetap butuh urutan total (urutan itu tidak ada).
Kamu ingin mendeteksi siklus dengan murah: topological sort yang gagal membuktikan ada siklus.Kamu butuh urutan terpendek atau optimal berdasarkan bobot tertentu; topological sort biasa mengabaikan bobot.
Kamu akan memproses urutannya sekali dalam O(V + E).Edge terus berubah dan kamu harus mengurutkan ulang di setiap perubahan, di mana struktur inkremental lebih cocok.

Kode Topological Sort

Implementasi Topological Sort yang rapi dan siap dijalankan dalam Python, JavaScript, Java, C++, C. Pilih bahasa, salin kodenya, atau buka langsung di Coddy Playground.

Kode Topological Sort dalam Python

Python
1from collections import deque2
3
4def topological_sort(graph):5    # Kahn's algorithm: repeatedly remove nodes with no incoming edges6    in_degree = {node: 0 for node in graph}7    for node in graph:8        for neighbor in graph[node]:9            in_degree[neighbor] += 110    queue = deque(node for node in graph if in_degree[node] == 0)11    order = []12    while queue:13        node = queue.popleft()14        order.append(node)15        for neighbor in graph[node]:16            in_degree[neighbor] -= 117            if in_degree[neighbor] == 0:18                queue.append(neighbor)19    if len(order) != len(graph):20        raise ValueError("Graph has a cycle, no topological order")21    return order22
23
24graph = {25    "shirt": ["tie", "jacket"],26    "tie": ["jacket"],27    "pants": ["shoes", "jacket"],28    "socks": ["shoes"],29    "shoes": [],30    "jacket": [],31}32
33print(" -> ".join(topological_sort(graph)))
Jalankan kode ini di Playground Python

FAQ Topological Sort

Untuk apa topological sort dipakai?

Topological sort mengurutkan tugas sehingga setiap ketergantungan muncul sebelum hal yang membutuhkannya. Contoh penggunaan nyatanya antara lain build system dan package manager (meng-compile dependensi lebih dulu), penjadwalan mata kuliah dengan prasyarat, dan urutan evaluasi rumus spreadsheet.

Berapa kompleksitas waktu topological sort?
Algoritma Kahn maupun pendekatan berbasis DFS berjalan dalam waktu O(V + E), karena setiap node diproses sekali dan setiap edge diperiksa sekali. Keduanya memakai ruang tambahan O(V).
Mengapa topological sort membutuhkan DAG?
Siklus berarah menciptakan kontradiksi: jika a harus muncul sebelum b dan b harus muncul sebelum a, tidak ada urutan linear yang bisa memenuhi keduanya. Jadi, urutan topologis ada jika dan hanya jika grafnya adalah directed acyclic graph. Algoritma Kahn mendeteksi siklus saat algoritma itu selesai sebelum mengeluarkan setiap node.
Apa perbedaan algoritma Kahn dan topological sort berbasis DFS?
Algoritma Kahn bersifat iteratif dan mirip BFS: algoritma ini berulang kali menghapus node dengan indegree 0, sehingga deteksi siklus dan urutannya benar-benar eksplisit. Pendekatan DFS mengunjungi node secara rekursif dan menaruh setiap node di depan urutan saat rekursinya selesai, sehingga menghasilkan kebalikan dari urutan waktu selesainya. Keduanya bernilai O(V + E); algoritma Kahn menghindari rekursi yang dalam dan secara alami menampilkan himpunan siap, sedangkan DFS sering lebih singkat ditulis.
Kapan sebaiknya memakai topological sort, bukan pengurutan biasa?
Pakai topological sort saat urutannya ditentukan oleh ketergantungan antar-item, bukan oleh key yang bisa dibandingkan. Pengurutan berbasis perbandingan biasa seperti mergesort O(n log n) mengurutkan berdasarkan nilai; topological sort mengurutkan berdasarkan edge "harus muncul sebelum", dan tidak seperti pengurutan berbasis perbandingan, topological sort bisa menghasilkan banyak jawaban yang valid untuk input yang sama.
Apakah hasil topological sort selalu unik?

Biasanya tidak. Setiap kali ada dua node atau lebih yang siap (indegree 0) pada saat yang sama, kamu boleh mengeluarkannya dalam urutan apa pun, jadi kebanyakan DAG punya beberapa urutan topologis yang valid. Urutannya hanya unik jika di setiap langkah ada tepat satu node yang siap, yaitu saat DAG membentuk satu rantai tunggal (Hamiltonian path).

Ilustrasi bahasa pemrograman di Coddy

Kuasai algoritma bersama Coddy

Mulai