Apa algoritma tercepat untuk menemukan semua jalur terpendek dalam grafik jarang?

24

Dalam grafik tanpa berat badan, tidak terarah dengan simpul dan tepi sehingga , apa cara tercepat untuk menemukan semua jalur terpendek dalam grafik? Bisakah itu dilakukan lebih cepat daripada Floyd-Warshall yang tetapi sangat cepat per iterasi?E 2 V > E O ( V 3 )VE2V>EO(V3)

Bagaimana jika grafik tertimbang?

Jakob Weisblat
sumber

Jawaban:

32

Karena ini adalah grafik tanpa bobot, Anda bisa menjalankan Breadth First Search (BFS) dari setiap titik v dalam grafik. Setiap menjalankan BFS memberi Anda jarak terpendek (dan jalur) dari titik awal ke setiap titik lainnya. Kompleksitas waktu untuk satu BFS adalah O(V+E)=O(V) karena E=O(V) dalam grafik Anda yang jarang. Menjalankannya V kali memberi Anda kompleksitas waktu O(V2) .

Untuk grafik berarah tertimbang, algoritma Johnson seperti yang disarankan oleh Yuval adalah yang tercepat untuk grafik jarang. Dibutuhkan O(V2logV+VE) yang dalam kasus Anda ternyata menjadi O(V2logV) . Untuk grafik tidak berarah tertimbang, Anda bisa menjalankan algoritma Dijkstradari setiap node, atau ganti setiap tepi yang tidak terarah dengan dua tepi yang diarahkan berlawanan dan jalankan algoritma Johnson. Kedua ini akan memberikan waktu aysmptotic yang sama dengan algoritma Johnson di atas untuk kasus Anda yang jarang. Perhatikan juga bahwa pendekatan BFS yang saya sebutkan di atas berfungsi untuk grafik langsung dan tidak langsung.

Paresh
sumber
7

Ada algoritma Johnson , yang waktu operasinya adalah .O(V2logV+VE)

Yuval Filmus
sumber
7

Anda dapat mencoba membuat versi Floyd-Warshall yang lebih cepat pada matriks yang jarang.

Pertama, mari kita ingat apa yang dilakukan algoritma ini:

Biarkan menjadi matriks jarak. Pada awal algoritma M i , j adalah bobot ujung i j . Jika tepi ini tidak ada maka M i , j = .MMi,jijMi,j=

Algoritma ini memiliki langkah-langkah Pada langkah k dari algoritma, untuk setiap pasangan node i , j kita aturVki,j

Mi,jmin{Mi,j,Mi,k+Mk,j}.

Jelas jika atau maka tidak ada pembaruan yang perlu dilakukan. Jadi, pada langkah pertama algoritma, kita hanya perlu melakukan kira-kira perbandingan di mana dan menunjukkan jumlah tepi masuk dan keluar dari simpul masing-masing. Seiring dengan perkembangan algoritma, semakin banyak entri dari matriks yang terisi. Karenanya, langkah terakhir mungkin membutuhkan waktu lebih lama.Mi,k=Mk,j=degin(k)degout(k)degin(k)degout(k)kM

Perhatikan bahwa kita membutuhkan cara yang efisien untuk beralih hanya pada sel-sel non-infinite di baris ke- dan kolom dari matriks. Ini dapat dilakukan dengan menjaga satu set tepi yang masuk dan keluar untuk setiap node.k

Tampak bahwa langkah-langkah pertama dari algoritma dapat sangat diuntungkan dari sparsity. Misalnya, grafik yang dibangun secara acak dengan menunjukkan bahwa iterasi pertama ( ) hanya langkah. Jika grafik dibagi menjadi banyak komponen yang terhubung maka matriks akan tetap relatif jarang di seluruh algoritma dan total runtime bisa serendah . Di sisi lain, jika grafik hanya berisi satu komponen yang terhubung, maka iterasi terakhirdiharapkan untuk mengambil langkah . Dalam hal ini total run-time bisa . Sebesar versi non-jarang.k = 0 O ( 1 ) M O ( V ) k = | V | O ( V 2 )E=O(V)k=0O(1)MO(V)k=|V|O(V2)O(V3)

Amit Moscovich
sumber