Apa algoritma dan struktur data yang paling efisien untuk menjaga informasi komponen yang terhubung pada grafik dinamis?


9

Katakanlah saya memiliki grafik jarang hingga tidak terarah, dan harus dapat menjalankan kueri berikut secara efisien:

  • sayasCHainnected(N1,N2) - mengembalikan jika ada jalur antara dan , jika tidakN 1 N 2 FTN1N2F
  • CHainnectedNHaides(N) - mengembalikan set node yang dapat dijangkau dariN

Ini mudah dilakukan dengan pra-komputasi komponen yang terhubung dari grafik. Kedua kueri dapat berjalan dalam waktu.HAI(1)

Jika saya juga harus dapat menambahkan tepi secara sewenang-wenang - - maka saya dapat menyimpan komponen dalam struktur data yang terpisah- . Setiap kali tepi ditambahkan, jika menghubungkan dua node di komponen yang berbeda, saya akan menggabungkan komponen-komponen itu. Ini menambahkan biaya ke dan biaya untuk dan (yang mungkin juga ).SEBUAHddEdge(N1,N2)A d d E d g e O ( I n v e r s e A c k e r m a n n ( | N o d e s | ) ) I s C o n n e c t e d C o n n e c t e d N oHAI(1)SEBUAHddEdgeO(InverseAckermann(|Nodes|))IsConnectedConnectedNodesO(1)

Jika saya juga harus dapat menghapus tepi secara sewenang-wenang, apa struktur data terbaik untuk menangani situasi ini? Apakah ada yang diketahui? Untuk meringkas, itu harus mendukung operasi berikut secara efisien:

  • IsConnected(N1,N2) - mengembalikan jika ada jalur antara dan , jika .TN1N2F
  • ConnectedNodes(N) - mengembalikan set node yang dicapai dari .N
  • AddEdge(N1,N2) - menambahkan keunggulan antara dua node. Perhatikan bahwa N1 , N2 atau keduanya mungkin belum ada sebelumnya.
  • RemoveEdge(N1,N2) - menghapus tepi yang ada di antara dua node.

(Saya tertarik pada ini dari perspektif pengembangan game - masalah ini tampaknya terjadi dalam beberapa situasi. Mungkin pemain dapat membangun saluran listrik dan kita perlu tahu apakah generator terhubung ke bangunan. Mungkin pemain dapat mengunci dan membuka kunci pintu, dan kita perlu tahu apakah musuh dapat mencapai pemain. Tapi itu masalah yang sangat umum, jadi saya mengatakannya seperti itu)


CHainnectedNHaides tidak mungkin berjalan di , karena jika mengembalikan daftar node, itu akan memerlukan waktu . Menerapkan dengan BFS adalah optimal, sehingga struktur data potensial hanya perlu mendukung IsConnected, AddEdge dan RemoveEdge. Ini sepertinya relevan dengan pertanyaan Anda: stackoverflow.com/questions/7241151/…HAI(1)nΩ(n)CHainnectedNHaides
Tom van der Zanden

@ TomvanderZanden Mengembalikan set yang sudah dibangun (dalam pemrograman, pointer atau referensi) adalah ... walaupun tidak banyak pengguna bisa melakukan itu dan tidak tercakup oleh . HAI(1)CHainnectedNHaidesHAI(1)sayasCHainnected
user253751

Jawaban:


11

Masalah ini dikenal sebagai konektivitas dinamis dan merupakan bidang penelitian aktif dalam komunitas ilmu komputer teoretis. Masih ada beberapa masalah penting yang masih terbuka di sini.

Agar terminologinya jelas, Anda meminta konektivitas yang sepenuhnya dinamis karena Anda ingin menambah dan menghapus tepian. Ada hasil Holm, de Lichtenberg dan Thorup (J.ACM 2001) yang mencapai waktu pembaruan dan waktu permintaan . Dari pemahaman saya, ini sepertinya bisa diterapkan. Secara sederhana, struktur data mempertahankan hierarki rentang pohon - dan konektivitas dinamis pada pohon lebih mudah untuk dicakup. Saya dapat merekomendasikan catatan Erik D. Demaine untuk penjelasan yang baik lihat di sini untuk video. Catatan Erik juga berisi petunjuk untuk hasil relevan lainnya. Sebagai catatan: semua hasil ini adalah hasil teoritis.HAI(catatan2n)HAI(catatann/catatancatatann)

Struktur data ini mungkin tidak menyediakan kueri ConnectedNodes per se, tetapi mudah untuk mencapainya. Pertahankan saja sebagai struktur data tambahan grafik (katakanlah sebagai daftar tepi yang terhubung ganda) dan lakukan pencarian kedalaman-pertama untuk mendapatkan node yang dapat dijangkau dari node tertentu.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.