Saya memiliki DAG dependensi yang berisi banyak tepi yang berlebihan (lihat contoh di bawah). Saya ingin algoritma "cepat" (mis. Dapat menangani grafik dengan beberapa ribu node / tepi) yang menemukan sub grafik minimal.
Sebagai contoh:
A -> B -> C
A -> C
dalam kata-kata A adalah prasyarat untuk B, dan B adalah prasyarat untuk C, dan juga A adalah prasyarat untuk C. Dalam hal ini A -> C berlebihan (karena B sudah perlu untuk mencapai C, dan A perlu untuk mencapai B) .
Sudah lama sejak saya mempelajari algoritma, dan saya tidak yakin harus mulai dari mana.
By the way, itu tidak penting bahwa algoritma menemukan minimum global, minimum lokal baik-baik saja (pengurangan tepi hanya optimasi runtime untuk tahap pemrosesan selanjutnya).
Juga, saya menyadari ini adalah CS QA dan bukan pemrograman, tetapi program saya ditulis dalam Python, jadi saya akan sangat senang mengetahui modul python atau open source untuk melakukan pengurangan ini, kalau-kalau Anda tahu itu.
Terima kasih sebelumnya!
Jawaban:
Pengurangan Transitif dari Sutradara Grafik AV Aho, MR Garey, dan JD Ullman
Menurut wikipedia , algoritma ini digunakan oleh
tred
yang merupakan alat untuk reduksi transitif yang tersedia dalam paket GraphViz. Anda dapat menjalankannya di grafik dan mengurangi grafik.Pertanyaan ini merupakan duplikat dari pertanyaan stackoverflow ini .
kode di sini
graphviz/tools/src/tred.c
tidak menggunakan DFS. ;-)sumber
tred
, terima kasih.Saya akhirnya menyelesaikannya dengan cara ini:
Struktur data saya terbuat dari
dependends
kamus, dari id node ke daftar node yang bergantung padanya (mis. Pengikutnya di DAG).Saya belum menghitung kompleksitas persisnya, tetapi menelan grafik saya beberapa ribu dalam sepersekian detik.
sumber