Menu
CoddyTech

Depth-First Search (DFS)

Terakhir diperbarui

Depth-first search adalah algoritma yang menjelajahi graf dengan masuk sedalam mungkin di setiap cabang sebelum backtrack (mundur). Dimulai dari sebuah node sumber, DFS mengunjungi satu tetangga, lalu tetangga dari tetangga itu, dan seterusnya sampai menemui jalan buntu (node tanpa tetangga yang belum dikunjungi). Pada titik itu DFS mundur dan mencoba cabang berikutnya. Tekan Putar di atas untuk melihatnya menyusuri satu jalur, mencapai dasar, lalu kembali keluar.

DFS paling alami ditulis dengan stack, entah stack eksplisit (seperti dalam animasi ini) atau call stack lewat rekursi. DFS mengunjungi setiap node dan edge sekali, jadi berjalan dalam waktu O(V + E) untuk graf dengan V vertex dan E edge.

Kompleksitas waktu dan ruang

UkuranKompleksitasCatatan
WaktuO(V + E)Setiap vertex dan edge dikunjungi sekali
RuangO(V)Stack + himpunan visited, kasus terburuk semua node
PenelusuranTerdalam lebih duluMenyusuri satu cabang sampai ujung sebelum cabang lainnya
Struktur dataStack (atau rekursi)Urutan LIFO yang menghasilkan perilaku depth-first

Langkah demi langkah

LangkahApa yang terjadi
1Push node sumber ke stack.
2Pop sebuah node; jika sudah dikunjungi, lewati.
3Tandai sudah dikunjungi dan catat edge yang mencapainya.
4Push semua tetangganya yang belum dikunjungi ke stack.
5Ulangi sampai stack kosong.

Contoh penerapan

DFS iteratif dari A pada graf A → [B, C], B → [D], C → [E], dengan tetangga di-push sesuai urutan daftar (stack LIFO mengeluarkan yang terakhir di-push lebih dulu):

LangkahStack (atas di kanan)Sudah dikunjungiAksi
1[A]{}Push sumber A.
2[B, C]{A}Pop A, tandai sudah dikunjungi, push tetangga B lalu C.
3[B, E]{A, C}Pop C, tandai sudah dikunjungi, push tetangga E.
4[B]{A, C, E}Pop E, tandai sudah dikunjungi, tanpa tetangga.
5[D]{A, C, E, B}Pop B, tandai sudah dikunjungi, push tetangga D.
6[]{A, C, E, B, D}Pop D, tandai sudah dikunjungi, stack kosong: selesai.

Kapan memakai DFS

Pakai saatHindari saat
Kamu butuh deteksi siklus, topological sort, atau mencari komponen terhubung.Kamu butuh jalur terpendek pada graf tak berbobot: BFS bisa melakukannya, DFS tidak.
Grafnya lebar dan dangkal, jadi stack memakai jauh lebih sedikit memori daripada queue berisi banyak node frontier.Grafnya sangat dalam dan kamu memakai rekursi: call stack bisa overflow.
Kamu ingin menjelajahi semua jalur secara menyeluruh, seperti pada pemecahan labirin atau pencarian backtracking.Kamu butuh node ditemukan sesuai urutan jaraknya dari sumber.
Kamu memeriksa keterjangkauan atau ada tidaknya jalur antara dua node.Kamu harus menjamin jumlah edge paling sedikit pada jalur yang ditemukan.

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

Kode Depth-First Search dalam Python

Python
1def dfs(graph, node, visited):2    visited.add(node)3    order = [node]4    for neighbor in graph[node]:5        if neighbor not in visited:6            order.extend(dfs(graph, neighbor, visited))7    return order8
9
10graph = {11    "A": ["B", "C"],12    "B": ["D", "E"],13    "C": ["F"],14    "D": [],15    "E": ["F"],16    "F": [],17}18
19order = dfs(graph, "A", set())20print("DFS order:", " -> ".join(order))
Jalankan kode ini di Playground Python
Berapa kompleksitas waktu DFS?
DFS berjalan dalam waktu O(V + E), dengan V adalah jumlah vertex dan E jumlah edge, karena DFS mengunjungi setiap vertex sekali dan memeriksa setiap edge sekali. DFS memakai ruang O(V) untuk stack dan himpunan visited.
Apa perbedaan DFS dan BFS?
DFS memakai stack dan masuk dalam di satu cabang sebelum backtrack, sedangkan BFS memakai queue dan menjelajah level demi level, node terdekat lebih dulu. BFS menemukan jalur terpendek pada graf tak berbobot; DFS tidak, tetapi memakai lebih sedikit memori pada graf lebar dan cocok untuk tugas seperti deteksi siklus dan topological sort.
Apakah DFS rekursif atau iteratif?

Keduanya bisa. Versi rekursif memakai call stack program secara implisit dan sangat ringkas; versi iteratif memakai stack eksplisit (seperti animasi di sini) dan menghindari stack overflow akibat rekursi yang dalam pada graf besar.

Kapan sebaiknya memakai DFS, bukan BFS?

Pakai DFS saat kamu perlu menjelajahi jalur secara utuh: deteksi siklus, topological sort, komponen terhubung, atau pencarian backtracking seperti memecahkan labirin. DFS juga memakai lebih sedikit memori pada graf lebar, karena stack hanya menyimpan frontier dari satu cabang dalam satu waktu. Pakai BFS setiap kali kamu butuh jalur terpendek pada graf tak berbobot atau node sesuai urutan jaraknya dari sumber.

Bisakah DFS menemukan jalur terpendek?
Tidak bisa diandalkan. DFS mengembalikan jalur pertama yang kebetulan ditemukannya, yang sering kali bukan jalur dengan edge paling sedikit, karena DFS memilih masuk dalam alih-alih meluas ke luar secara merata. Untuk jalur terpendek pada graf tak berbobot, pakai BFS, dan untuk graf berbobot, pakai algoritma Dijkstra.
Mengapa DFS butuh himpunan visited?
Tanpa himpunan visited, DFS akan mengunjungi ulang node yang bisa dicapai lewat beberapa jalur, dan pada graf yang bersiklus akan berputar tanpa akhir. Menandai node sudah dikunjungi saat di-pop (dan melewati hasil pop yang sudah dikunjungi) menjamin setiap node diproses sekali dan menjaga waktu berjalannya tetap O(V + E). Kesalahan yang umum adalah menandai node hanya saat di-pop sambil tetap mem-push duplikat. Cara itu benar, tetapi bisa meninggalkan entri usang di stack yang harus dilewati.
Ilustrasi bahasa pemrograman di Coddy

Kuasai algoritma bersama Coddy

Mulai