Menu
CoddyTech

Breadth-First Search (BFS)

Terakhir diperbarui

Breadth-first search adalah algoritma yang menjelajahi graf level demi level. Dimulai dari sebuah node sumber, BFS mengunjungi semua tetangga langsungnya terlebih dahulu, lalu semua tetangga mereka yang belum dikunjungi, dan seterusnya, meluas ke luar dalam lingkaran-lingkaran dengan jarak yang makin jauh. Tekan Putar di atas untuk melihatnya menyebar dari node awal, satu lapis demi satu lapis.

BFS memakai queue first-in-first-out, dan queue inilah yang memaksakan urutan level demi level. Karena BFS mencapai node sesuai urutan jumlah lompatan, BFS menemukan jalur terpendek (edge paling sedikit) pada graf tak berbobot. BFS mengunjungi setiap node dan edge sekali, jadi berjalan dalam waktu O(V + E).

Kompleksitas waktu dan ruang

UkuranKompleksitasCatatan
WaktuO(V + E)Setiap vertex dan edge dikunjungi sekali
RuangO(V)Queue + himpunan visited, kasus terburuk semua node
PenelusuranLevel demi levelNode terdekat lebih dulu, dalam lingkaran
Jalur terpendekYa (tak berbobot)Mencapai setiap node lewat edge paling sedikit

Langkah demi langkah

LangkahApa yang terjadi
1Masukkan node sumber ke queue (enqueue).
2Keluarkan node terdepan (dequeue) dan tandai sudah dikunjungi.
3Periksa setiap tetangganya.
4Masukkan ke queue setiap tetangga yang belum dikunjungi atau belum ada di queue.
5Ulangi sampai queue kosong.

Contoh penerapan

Menelusuri graf ini dari node 0, dengan edge 0-1, 0-2, 1-3, 2-3, 2-4:

LangkahSudah dikunjungiQueue (frontier)
Mulai{}[0]
Dequeue 0{0}[1, 2]
Dequeue 1{0, 1}[2, 3]
Dequeue 2{0, 1, 2}[3, 4]
Dequeue 3{0, 1, 2, 3}[4]
Dequeue 4{0, 1, 2, 3, 4}[] (selesai)

Kapan memakai BFS

Pakai saatHindari saat
Kamu butuh jalur terpendek pada graf tak berbobotEdge punya bobot: pakai Dijkstra
Target kemungkinan besar dekat dengan sumberGrafnya sangat lebar: queue bisa menampung frontier yang sangat besar
Kamu ingin menjelajahi graf berdasarkan urutan levelKamu hanya perlu mencapai node mana pun, dan DFS memakai lebih sedikit memori
Kamu mencari komponen terhubung atau rute dengan lompatan paling sedikitKamu butuh topological sort atau deteksi siklus: DFS lebih cocok

BFS vs DFS

Keduanya menelusuri setiap node dalam O(V + E), tetapi urutan dan struktur datanya berbeda. Lihat visualisasi depth-first search untuk membandingkan keduanya berdampingan.

AspekBFSDFS
Struktur dataQueue (FIFO)Stack / rekursi
UrutanLevel demi level (terdekat lebih dulu)Masuk dalam di satu cabang, lalu backtrack
Jalur terpendek (tak berbobot)Ya: edge paling sedikitTidak: tidak terjamin
Memori pada graf lebarTinggi: frontier bisa sangat besarRendah: satu jalur dalam satu waktu
Paling cocok untukLompatan terpendek, komponen terhubungDeteksi siklus, topological sort, backtracking

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

Kode Breadth-First Search dalam Python

Python
1from collections import deque2
3
4def bfs(graph, start):5    visited = {start}6    queue = deque([start])7    order = []8    while queue:9        node = queue.popleft()10        order.append(node)11        for neighbor in graph[node]:12            if neighbor not in visited:13                visited.add(neighbor)  # mark on enqueue, not dequeue14                queue.append(neighbor)15    return order16
17
18graph = {19    "A": ["B", "C"],20    "B": ["D", "E"],21    "C": ["F"],22    "D": [],23    "E": ["F"],24    "F": [],25}26
27print("BFS order:", " -> ".join(bfs(graph, "A")))
Jalankan kode ini di Playground Python
Berapa kompleksitas waktu BFS?
BFS berjalan dalam waktu O(V + E), dengan V adalah jumlah vertex dan E jumlah edge, karena BFS mengunjungi setiap vertex sekali dan memeriksa setiap edge sekali. BFS memakai ruang O(V) untuk queue dan himpunan visited.
Apakah BFS menemukan jalur terpendek?
Ya, pada graf tak berbobot. Karena BFS mencapai node sesuai urutan jumlah lompatan dari sumber, pertama kali BFS mencapai sebuah node pasti lewat jalur dengan edge paling sedikit. Untuk graf berbobot, kamu butuh algoritma Dijkstra.
Apa perbedaan BFS dan DFS?
BFS memakai queue dan menjelajah level demi level (terdekat lebih dulu), sedangkan DFS memakai stack dan masuk dalam di satu cabang sebelum backtrack. BFS menemukan jalur terpendek tak berbobot; DFS memakai lebih sedikit memori pada graf lebar dan cocok untuk deteksi siklus dan topological sort.
Kapan sebaiknya memakai BFS, bukan algoritma Dijkstra?
Pakai BFS saat setiap edge punya biaya yang sama, karena BFS menemukan jalur dengan edge paling sedikit dalam waktu O(V + E) tanpa priority queue. Algoritma Dijkstra dibutuhkan saat edge punya bobot yang berbeda-beda; menjalankan BFS biasa pada graf berbobot memberi jalur dengan lompatan paling sedikit, bukan jalur dengan biaya paling rendah.
Mengapa BFS butuh himpunan visited?

Graf bisa berisi siklus, jadi tanpa himpunan visited BFS akan memasukkan node yang sama ke queue berulang kali dan berputar tanpa akhir. Menandai node saat pertama kali dimasukkan ke queue (bukan saat dikeluarkan) juga mencegah node yang sama ditambahkan ke queue dua kali oleh tetangga yang berbeda.

Sebaiknya node ditandai sudah dikunjungi saat enqueue atau saat dequeue?

Tandai saat enqueue. Jika kamu menunggu sampai dequeue, sebuah node bisa ditambahkan ke queue beberapa kali oleh tetangga yang berbeda sebelum diproses, sehingga membuang memori dan waktu. Menandai saat enqueue menjamin setiap node masuk ke queue tepat satu kali.

Ilustrasi bahasa pemrograman di Coddy

Kuasai algoritma bersama Coddy

Mulai