Pertimbangkan grafik terarah di mana seseorang dapat secara dinamis menambahkan tepi dan membuat beberapa pertanyaan tertentu.
Contoh: hutan disjoint-set
Pertimbangkan serangkaian pertanyaan berikut:
arrow(u, v)
equiv(u, v)
find(u)
yang pertama menambahkan panah ke grafik, yang kedua memutuskan jika u ↔ ∗ v , yang terakhir menemukan perwakilan kanonik dari kelas ekivalensi ↔ ∗ , yaitu r ( u ) sedemikian rupa sehingga u ↔ ∗ v menyiratkan r ( v ) = r ( u ) .
Ada algoritma yang terkenal menggunakan struktur data hutan disjoint-set yang mengimplementasikan query ini dalam kompleksitas diamasi-konstan diamasi, yaitu . Perhatikan bahwa dalam hal ini diterapkan menggunakan .equiv
find
Varian yang lebih kompleks
Sekarang saya tertarik pada masalah yang lebih kompleks di mana arahnya penting:
arrow(u, v)
confl(u, v)
find(u)
yang pertama menambahkan panah , detik memutuskan apakah ada simpul w yang dapat dicapai dari kedua u dan v , yaitu u → ∗ ← ∗ v . Yang terakhir harus mengembalikan objek r ( u ) sehingga u → ∗ ← ∗ v menyiratkan r ( u ) ∙ r ( v ) di mana ∙ harus mudah dihitung. (Untuk, katakanlah, menghitungconfl
). Tujuannya adalah untuk menemukan struktur data yang baik sehingga operasi ini cepat.
Siklus
Grafik dapat berisi siklus.
Saya tidak tahu apakah ada cara untuk secara efisien dan bertahap menghitung komponen yang sangat terhubung, untuk hanya mempertimbangkan DAG untuk masalah utama.
Tentu saja saya akan menghargai solusi untuk DAG juga. Ini akan sesuai dengan perhitungan tambahan dari leluhur yang paling tidak umum.
Pendekatan naif
Struktur data hutan yang terpisah-pisah tidak membantu di sini, karena mengabaikan arah tepi. Perhatikan bahwa tidak boleh berupa satu node, dalam kasus ini grafiknya tidak rapat.
Satu dapat menentukan dan untuk mendefinisikan ∙ sebagai S 1 ∙ S 2 ketika S 1 ∩ S 2 ≠ ∅ . Tetapi bagaimana cara menghitung ini secara bertahap?
Mungkin komputasi himpunan sebesar itu tidak berguna, himpunan yang lebih kecil seharusnya lebih menarik, seperti pada algoritma union-find yang biasa.