Bagaimana Anda melacak jalur Pencarian Breadth-First, seperti dalam contoh berikut:
Jika mencari kunci 11
, kembalikan daftar terpendek yang menghubungkan 1 hingga 11.
[1, 4, 7, 11]
python
algorithm
graph
breadth-first-search
Christopher Markieta
sumber
sumber
Jawaban:
Anda harus melihat http://en.wikipedia.org/wiki/Breadth-first_search terlebih dahulu.
Di bawah ini adalah implementasi cepat, di mana saya menggunakan daftar daftar untuk mewakili antrian jalur.
Pendekatan lain akan mempertahankan pemetaan dari setiap node ke induknya, dan saat memeriksa node yang berdekatan, catat induknya. Setelah pencarian selesai, cukup lacak balik sesuai pemetaan induk.
Kode di atas didasarkan pada asumsi bahwa tidak ada siklus.
sumber
Saya sangat menyukai jawaban pertama qiao! Satu-satunya hal yang hilang di sini adalah menandai simpul sebagai telah dikunjungi.
Mengapa kita perlu melakukannya?
Mari kita bayangkan bahwa ada node lain nomor 13 yang terhubung dari node 11. Sekarang tujuan kita adalah menemukan node 13.
Setelah sedikit dijalankan, antrian akan terlihat seperti ini:
Perhatikan bahwa ada DUA jalur dengan simpul nomor 10 di akhir.
Artinya jalur dari node nomor 10 akan diperiksa dua kali. Dalam hal ini tidak terlihat terlalu buruk karena node nomor 10 tidak memiliki anak .. Tetapi bisa sangat buruk (bahkan di sini kita akan memeriksa node itu dua kali tanpa alasan ..)
Node nomor 13 tidak ada jalur tersebut sehingga program tidak akan kembali sebelum mencapai jalur kedua dengan node nomor 10 di akhir .. Dan kami akan memeriksanya kembali ..
Yang hilang hanyalah satu set untuk menandai node yang dikunjungi dan tidak untuk memeriksanya lagi ..
Ini adalah kode qiao setelah modifikasi:
Output dari program ini adalah:
Tanpa pemeriksaan ulang yang tidak perlu ..
sumber
collections.deque
untukqueue
sebagai list.pop (0) dikenakanO(n)
gerakan memori. Juga, demi anak cucu, jika Anda ingin melakukan DFS cukup setelpath = queue.pop()
dalam hal ini variabelqueue
benar-benar bertindak seperti astack
.Kode yang sangat mudah. Anda terus menambahkan jalur setiap kali Anda menemukan sebuah node.
sumber
Saya pikir saya akan mencoba kode ini untuk bersenang-senang:
Jika Anda menginginkan siklus, Anda dapat menambahkan ini:
sumber
Saya suka jawaban pertama @Qiao dan penambahan @ Or. Demi sedikit pemrosesan, saya ingin menambahkan jawaban Or.
Dalam jawaban @ Or melacak node yang dikunjungi sangat bagus. Kami juga dapat mengizinkan program untuk keluar lebih cepat dari saat ini. Di beberapa titik di loop for,
current_neighbour
harus menjadiend
, dan begitu itu terjadi jalur terpendek ditemukan dan program dapat kembali.Saya akan memodifikasi metode sebagai berikut, perhatikan loop for
Output dan yang lainnya akan sama. Namun, kode akan membutuhkan waktu lebih sedikit untuk diproses. Ini sangat berguna pada grafik yang lebih besar. Saya harap ini membantu seseorang di masa depan.
sumber