Apa arti 'luasnya' dalam pencarian pertama yang luas?

11

Saya belajar tentang pencarian pertama yang luas dan sebuah pertanyaan muncul di benak saya mengapa BFS disebut demikian. Dalam buku Pengantar Algoritma oleh CLRS , saya membaca alasan berikut ini:

Pencarian Breadth-first dinamai demikian karena memperluas perbatasan antara simpul-simpul yang ditemukan dan yang belum ditemukan secara seragam melintasi luasnya perbatasan.

Namun, saya tidak dapat memahami arti dari pernyataan ini. Saya bingung tentang kata "perbatasan" dan luasnya perbatasan itu.

Jadi, bisakah seseorang tolong jawab pertanyaan ini dengan cara yang mudah dimengerti untuk pemula seperti saya?

TheHungryCoder
sumber
4
Dalam hal beberapa pembaca tidak terbiasa dengan arti kata bahasa Inggris (di luar penggunaannya sebagai bagian dari istilah teknis ini): merriam-webster.com/dictionary/breadth atau dictionary.cambridge.org/dictionary/english/breadth . Ini mirip dengan "lebar", dimensi berbeda dari "kedalaman" jika Anda berbicara tentang ukuran / bentuk objek fisik. Dan dalam pengertian metaforis seperti kedalaman pengetahuan (ahli pada satu subjek) vs luasnya pengetahuan (banyak subjek).
Peter Cordes

Jawaban:

22

Pertimbangkan struktur data yang digunakan untuk mewakili pencarian. Di BFS, Anda menggunakan antrian. Jika Anda menemukan simpul yang tidak terlihat, Anda menambahkannya ke antrian.

"Perbatasan" adalah himpunan semua node dalam struktur data pencarian. Antrian akan beriterasi melalui semua node di perbatasan secara berurutan, dengan demikian iterasi melintasi luas perbatasan. DFS akan selalu memunculkan status terakhir yang ditemukan dari tumpukan, sehingga selalu beralih ke bagian terdalam perbatasan.

Perhatikan gambar di bawah ini. Perhatikan bagaimana DFS langsung menuju ke bagian terdalam dari pohon sedangkan BFS berulang pada luasnya setiap tingkat.

dfs bfs

Gambar di sini

Throckmorton
sumber
2
Saya pikir kata frontier mungkin merujuk ke tepi node yang ditemukan. Ketika Anda baru tahu a, perbatasannya ada a. Ketika Anda telah menemukan a, b, c, perbatasan adalah b, c. Ketika Anda telah menemukan a, b, c, d, e, f, g, perbatasan adalah d, e, f, g. Dengan kata lain, simpul-simpul yang telah ditemukan dan yang kita belum cari di luar.
Theodoros Chatzigiannakis
Saya pikir ini adalah poin yang adil, tetapi saya berpikir bahwa "perbatasan" dapat diartikan beberapa cara, dengan penjelasan umum di atas masih berfungsi.
Throckmorton
2

Kutipan yang Anda berikan mengatakan "perbatasan antara simpul yang ditemukan dan yang belum ditemukan". Jadi itulah perbatasan yang penulis bicarakan: perbatasan antara simpul yang ditemukan dan yang belum ditemukan. Anda memiliki beberapa simpul yang belum Anda lihat sama sekali. Anda juga memiliki beberapa simpul yang untuknya Anda telah melihat segalanya. Dan kemudian Anda memiliki simpul di antaranya. Ini adalah simpul yang telah Anda lihat, tetapi Anda belum memuat semua anak mereka. Ini perbatasan.

Membahas ini lebih lanjut tentang:

Untuk melacak kemajuan warna BFS setiap titik putih, abu-abu, atau hitam. Semua simpul mulai putih dan kemudian menjadi abu-abu dan kemudian hitam. Vertex ditemukan saat pertama kali ditemukan selama pencarian, di mana saat itu menjadi non-putih. Oleh karena itu, simpul abu-abu dan hitam telah ditemukan, tetapi BFS membedakannya untuk memastikan bahwa pencarian berlangsung dengan cara BF.
...
setiap titik awalnya berwarna putih, berwarna abu-abu ketika ditemukan dalam pencarian, dan dihitamkan ketika selesai, yaitu, ketika daftar kedekatannya telah diperiksa sepenuhnya.

Jadi semua simpul mulai putih (belum ditemukan). Ketika sebuah simpul ditemukan, warnanya abu-abu (perbatasan). Ketika semua yang ditunjukkannya telah ditemukan, warnanya hitam (sepenuhnya ditemukan). Perbatasan adalah himpunan poin yang telah ditemukan, tetapi memiliki anak-anak yang belum ditemukan.

Misalkan Anda mencari sesuatu di situs web. Anda pertama kali pergi ke halaman utama. Misalkan itu berlabel "binatang". Batas saat ini adalah {"binatang"}. Anda melihat melalui halaman utama dan tidak melihat apa yang Anda cari. Tetapi Anda perhatikan bahwa ia memiliki tautan ke dua halaman lagi, "berkaki empat" dan "cacing". Jadi, Anda mengeklik tautan ke "berkaki empat". Sekarang batasnya adalah {"binatang", "berkaki empat"}. Anda melihat melalui "berkaki empat" dan tidak menemukan apa yang Anda cari. Apa yang kamu lakukan selanjutnya? Anda dapat mencari tautan pada "binatang berkaki empat" dan mengikuti itu, atau kembali ke "binatang" dan mengklik tautan ke "cacing". Yang pertama adalah pencarian mendalam-pertama, dan yang kedua adalah pencarian luas pertama.

"depth" mengacu pada berapa banyak tautan dari simpul akar yang diperlukan untuk sampai ke suatu simpul, sementara "keluasan" mengacu pada simpul-simpul sebagai kedalaman yang sama. Pada contoh di atas, BFS dimulai dari "animals" dan pertama-tama melihat semua node satu, jadi ia melihat "quadrupeds" dan "worm" terlebih dahulu. Setelah melihat semua kedalaman-1 node, itu memperluas perbatasan di semua node; yaitu, ia melihat anak-anak dari semua node kedalaman-1 sebelum melihat salah satu dari anak-anak node kedalaman-2. Jadi, misalnya, jika salah satu tautan pada halaman "berkaki empat" adalah "primata", ia akan melihat semua tautan pada halaman "cacing" sebelum ia melihat salah satu tautan pada halaman "primata".

Akumulasi
sumber
1

Misalkan algoritma BFS dijalankan mulai dari vertex . Bayangkan gelombang yang dikirim keluar dari (seperti air gelombang atau tsunami). Setelah satu langkah waktu, gelombang akan mencapai semua tetangga . Setelah dua langkah waktu, gelombang akan mencapai (atau "dikunjungi") semua simpul yang paling jauh dari . Dan seterusnya. aaa2a

Pada waktu tertentu, batas gelombang adalah tepat simpul yang disimpan dalam struktur data antrian (simpul-simpul ini telah dikunjungi tetapi belum dieksplorasi lebih lanjut).

Dengan demikian, gelombang awalnya mencapai seluruh "luasnya" dari semua simpul yang berjarak 1 dari . Setelah beberapa langkah waktu, gelombang akan menutupi seluruh lebar hingga jarak tertentu dari titik awal . aa

Himpunan simpul pada jarak dari disebut lapisan di partisi jarak grafik sehubungan dengan simpul . Set vertex adalah penyatuan terputus-putus dari lapisan-lapisan ini . Lapisan adalah , lapisan pertama adalah himpunan tetangga dari , lapisan kedua adalah himpunan simpul yang jaraknya ke adalah dua, dan seterusnya. Algoritma BFS mengunjungi simpul grafik dalam urutan tertentu - lapis demi lapis. Setiap lapisan menutupi seluruh luasnya, tetapi lapisan yang berbeda berada pada kedalaman yang berbeda.kaka(k0)0{a}aa

Di sisi lain, algoritma DFS akan mengeksplorasi sedalam mungkin dalam satu arah (yaitu mengunjungi 's tetangga pertama, kemudian tetangganya, kemudian tetangganya, dan sebagainya) sebelum kembali kembali ke dan mengunjungi tetangga yang belum dijelajahi berikutnya . Algoritma ini masuk lebih dulu, daripada mengunjungi tetangga secara luas. aaa

Dengan demikian, DFS dan BFS berbeda dalam urutan di mana mereka mengunjungi simpul.

mo2019
sumber