Pencarian graf: BFS dan DFS
Pada 1736 Leonhard Euler menunjukkan bahwa tidak ada rute jalan kaki yang melintasi ketujuh jembatan Königsberg masing-masing tepat sekali, dan teori graf berawal dari jawaban itu.
Titik dan garis
Graf adalah himpunan titik, yang disebut simpul (vertex atau node), yang dihubungkan oleh garis, yang disebut sisi (edge). Gagasannya sederhana, tetapi cocok untuk banyak sekali hal: kota yang dihubungkan jalan, halaman web yang dihubungkan tautan, orang yang dihubungkan pertemanan, petak labirin yang terhubung di tempat yang tidak berdinding. Begitu sebuah masalah digambar sebagai graf, segelintir algoritma yang sama bisa menjawab pertanyaan seperti "bisakah aku pergi dari sini ke sana?" dan "jalan mana yang terpendek?"
Menyimpan graf dalam kode
Cara yang umum untuk menyimpan graf adalah daftar ketetanggaan (adjacency list): untuk setiap simpul, daftar tetangganya. Catatan kuliah 6.006 MIT memakai cara ini, yaitu array atau kamus Adj dengan Adj[u] berisi simpul-simpul yang terhubung ke u. Untuk graf di atas bentuknya seperti ini:
const graph = {
A: ["B", "C"],
B: ["A", "D"],
C: ["A", "D", "E"],
D: ["B", "C", "F"],
E: ["C", "F"],
F: ["D", "E"],
};Pencarian melebar (breadth-first search): lapis demi lapis
Pencarian melebar (BFS) menjelajahi graf berlapis-lapis di sekitar titik awal. Pertama titik awal itu sendiri, pada jarak 0. Lalu semua tetangganya, pada jarak 1. Lalu setiap simpul baru di sebelah simpul-simpul itu, pada jarak 2, dan seterusnya. Untuk itu BFS menyimpan antrean (queue), yaitu barisan tempat yang pertama masuk menjadi yang pertama keluar. Ambil simpul di depan antrean, kunjungi, lalu tambahkan tetangganya yang belum terlihat ke belakang antrean. Dari A pada contoh, BFS mengunjungi A, lalu B dan C, lalu D dan E, lalu F. Karena bergerak keluar satu lapis demi satu lapis, saat pertama kali BFS mencapai sebuah simpul, ia sudah menemukan jalur dengan sisi paling sedikit. F berjarak 3 sisi dari A, misalnya A, B, D, F.
function bfs(graph, start) {
const seen = new Set([start]);
const queue = [start];
const order = [];
while (queue.length) {
const u = queue.shift(); // masuk pertama, keluar pertama
order.push(u);
for (const v of graph[u]) {
if (!seen.has(v)) { seen.add(v); queue.push(v); }
}
}
return order; // A B C D E F
}Pencarian mendalam (depth-first search): sejauh mungkin, lalu mundur
Pencarian mendalam (DFS) berperilaku seperti orang di labirin yang menjaga satu tangannya tetap menempel di dinding. DFS mengikuti satu jalur sedalam mungkin. Ketika sampai di jalan buntu atau tempat yang sudah pernah dilihat, ia mundur ke titik pilihan terakhir dan mencoba pilihan berikutnya. DFS memakai tumpukan (stack), bukan antrean, masuk terakhir keluar pertama, dan sangat wajar ditulis dengan rekursi, karena tumpukan pemanggilanlah yang mengingat. Dari A, DFS rekursif mengunjungi A, B, D, C, E, F. DFS mencapai setiap simpul yang dicapai BFS, tetapi jalur yang diikutinya belum tentu yang terpendek.
function dfs(graph, u, seen = new Set(), order = []) {
seen.add(u);
order.push(u);
for (const v of graph[u]) if (!seen.has(v)) dfs(graph, v, seen, order);
return order; // A B D C E F
}Seret untuk memutar. Gulir atau cubit untuk memperbesar.
Mana yang dipakai
Pada labirin pertama di laboratorium, BFS mengunjungi 105 petak dan menemukan jalur 22 gerakan, yang terpendek. DFS kebetulan menukik ke arah tujuan dan hanya mengunjungi 31 petak, tetapi jalurnya butuh 28 gerakan. Tidak ada yang selalu lebih murah. Keduanya menangani setiap simpul dan setiap sisi dalam jumlah kali yang tetap, jadi keduanya berjalan dalam waktu O(V + E) untuk V simpul dan E sisi. Pilih BFS kalau kamu butuh langkah paling sedikit: gerakan paling sedikit dalam teka-teki, tautan paling sedikit antara dua orang. Pilih DFS kalau kamu perlu menjelajahi semuanya atau mengikuti pilihan sampai ujung: memeriksa apakah setiap ruangan labirin terhubung, atau mencoba gerakan teka-teki satu jalur demi satu jalur dan mundur saat buntu. Kalau sisi-sisinya punya panjang berbeda, seperti jalan raya, keduanya saja tidak cukup; metode seperti algoritma Dijkstra memperluas gagasan BFS dengan jarak.
| graf | Simpul-simpul yang dihubungkan oleh sisi |
| simpul (vertex, node) | Sebuah titik pada graf |
| sisi (edge) | Garis yang menghubungkan dua simpul |
| daftar ketetanggaan (adjacency list) | Untuk setiap simpul, daftar tetangganya |
| antrean (queue) | Masuk pertama, keluar pertama; dipakai BFS |
| BFS | Pencarian melebar: lapis demi lapis; menemukan jalur dengan sisi paling sedikit |
| DFS | Pencarian mendalam: masuk dalam dulu, lalu mundur; memakai tumpukan |
| O(V + E) | Waktu jalan BFS dan DFS |
- Pada graf contoh, ada berapa sisi pada jalur terpendek dari A ke F?
- Ada berapa sisi pada graf contoh?
- Struktur data apa yang dipakai pencarian melebar?
- Antrean (masuk pertama, keluar pertama)
- Tumpukan (masuk terakhir, keluar pertama)
- Daftar terurut
- Tidak memakai struktur apa pun
- Pencarian mana yang pasti menemukan jalur dengan sisi paling sedikit?
- BFS
- DFS
- Keduanya, selalu
- Tidak keduanya
- Susun simpul-simpul sesuai urutan kunjungan BFS dari A (tetangga diambil menurut abjad).
- Susun simpul-simpul sesuai urutan kunjungan DFS rekursif dari A (tetangga menurut abjad).
- Pada grid 15 kali 9 di laboratorium dengan semua dinding dihapus, berapa gerakan jalur terpendek dari S (kiri atas) ke G (kanan bawah)?
- Mengapa BFS dan DFS harus mengingat simpul yang sudah dilihat?
- Kalau tidak, putaran di graf akan membuat pencarian berputar selamanya
- Untuk mencetaknya di akhir
- Untuk mengurutkannya
- Hanya diperlukan untuk DFS
- Pada tahun berapa Euler menyelesaikan masalah jembatan Königsberg?
- 1683
- 1736
- 1843
- 1945
- Berapa waktu jalan BFS pada graf dengan V simpul dan E sisi?
- O(V + E)
- O(V × E)
- O(log V)
- O(2ⱽ)
- Kamu ingin tahu jumlah tautan teman-dari-teman paling sedikit antara dua orang di jejaring sosial. Pencarian yang mana?
- BFS
- DFS
- Pencarian biner
- Merge sort
- Graf adalah simpul yang dihubungkan oleh sisi; daftar ketetanggaan menyimpannya.
- BFS memakai antrean, bergerak lapis demi lapis, dan menemukan jalur dengan sisi paling sedikit.
- DFS memakai tumpukan (atau rekursi), masuk dalam dulu, lalu mundur.
- Keduanya berjalan dalam O(V + E) dan harus mengingat simpul yang sudah dilihat.
- Penyelesaian jembatan Königsberg oleh Euler pada 1736 mengawali teori graf.
Sumber kursus ini (11)
- MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
- lecture notes 1 Introduction, 3 Sorting, 9 Breadth-First Search, 10 Depth-First Search (ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes) and Fall 2011 lecture 13 BFS notes (ocw.mit.edu/courses/6-006-introduction-to-algorithms-fall-2011)
- Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms (MIT Press)
- with the CLRS-based Khan Academy algorithms unit by Thomas Cormen and Devin Balkcom of Dartmouth (khanacademy.org/computing/computer-science/algorithms: binary search, selection sort analysis, merge sort, quicksort overview and analysis)
- MacTutor History of Mathematics, Al-Khwarizmi (mathshistory.st-andrews.ac.uk/Biographies/Al-Khwarizmi: word algorithm from the Latin title Algoritmi de numero Indorum)
- D. E. Joyce, Euclid's Elements Book VII Propositions 1 and 2 (mathcs.clarku.edu/~djoyce/elements/bookVII)
- Wolfram MathWorld, Merge Sort (mathworld.wolfram.com/MergeSort.html: proposed by John von Neumann in 1945, after Knuth 1998 p. 159)
- Stanford CS "Tony Hoare: Quicksort" (cs.stanford.edu/people/eroberts/courses/soco/projects/2008-09/tony-hoare/quicksort.html: devised while a student at Moscow State University for Russian-English machine translation with a tape dictionary, programmed in Algol 60 and published 1961; the year 1959 from the Wikipedia Quicksort article and its cited sources)
- Bodleian Libraries, Ada Lovelace (blogs.bodleian.ox.ac.uk/adalovelace: 1843 paper, Note G Bernoulli numbers)
- Fourmilab text of Menabrea's Sketch with Lovelace's notes (fourmilab.ch/babbage/sketch.html)
- Seven Bridges of Konigsberg (Euler 1736) and Tower of Hanoi (Edouard Lucas, 1883) checked against the Wikipedia articles and their cited sources.
Diperiksa: 2026-10-17