Apakah lindung nilai serikat selalu secepat memecah belah dan menaklukkan?

8

Adams menjelaskan algoritma divide-and-conquer untuk menemukan penyatuan dua set (direpresentasikan sebagai pohon pencarian biner seimbang). Dia kemudian menjelaskan algoritma "lindung nilai" yang baru dan kemudian dia klaim tingkatkan pada algoritma divide-and-conquer. Namun, ia tidak menawarkan bukti, atau bahkan penjelasan nyata, mengapa harus demikianHAI(m+n), apalagi mengapa itu harus lebih cepat dari divide-and-conquer.

Blelloch, Ferizovic, dan Sun menunjukkan bahwa algoritma divide-and-menaklukkan Adams benar-benar mencapai optimal secara teoritisΘ(mcatatan(n/m+1)) dimana mn. Namun, mereka tidak membahas algoritma lindung nilai serikat pekerja.

Apakah hedge union, pada kenyataannya, seefisien divide-and-menaklukkan? Bagian yang paling tidak jelas adalah trim bagian dalam. Tampaknya, setidaknya secara dangkal, untuk menduplikasi pekerjaan antara sub pohon kiri dan kanan yang dibagi penuh di antara mereka. Mungkin ini baik-baik saja untuk beberapa alasan, tetapi saya tidak tahu mengapa.

Penyelidikan lebih lanjut: Haskell Data.Setdan Data.Mapmenggunakan varian lindung nilai persimpangan dan perbedaan, serta persatuan. Saya belum menemukan diskusi yang dipublikasikan tentang algoritma tersebut sama sekali. Pertanyaan serupa juga berlaku untuk ini.

dfeuer
sumber

Jawaban:

3

Sementara saya belum melihat, atau menghasilkan, analisis teoritis dari algoritma lindung nilai, saya memiliki beberapa bukti empiris bahwa mereka lebih buruk daripada algoritma divide-and-conquer untuk pohon biner.

Dimulai dengan kode dalam containerspaket Haskell , saya mengoptimalkan algoritma hedge union dengan secara manual menerapkan spesialisasi pola panggilan untuk mengurangi alokasi perantara. Ini meningkatkan kinerjanya sekitar 10%, memberikan pukulan yang adil.

Dimulai dengan kode bagi-dan-taklukkan di Adams, saya mengoptimalkan algoritme penyatuan dengan menambahkan kasus khusus ketika salah satu inputnya adalah singleton (kode lindung nilai serikat mengoptimalkan satu sisi dengan demikian, dan tidak jelas apakah sisi lain dapat dioptimalkan demikian pula).

Saya menguji setiap implementasi dengan menggunakan kumpulan set tolok ukur operasi yang disertakan containers. Divide-and-conquer biasanya lebih cepat daripada hedge, terkadang dua kali lebih cepat. Ketika lambat, itu hanya sedikit.

Tolok ukur serupa dari operasi himpunan lainnya memberikan hasil yang serupa.


Spekulasi:

Algoritma lindung nilai mungkin bermanfaat saat menggunakan pohon dengan faktor percabangan besar, yang mungkin lebih mahal untuk dipecah secara rekursif. Mereka mungkin juga bermanfaat untuk sub pohon kecil, di mana mereka dapat menghemat alokasi yang cukup untuk mendapatkan pekerjaan ekstra.

dfeuer
sumber
Apakah Anda benar-benar mengubah implementasi Data.Setberdasarkan pengamatan ini?
Joachim Breitner
@ JoachimBreitner, ya, sudah. Saya juga menggunakan pendekatan yang sama untuk utilitas gabungan aman yang baru, meskipun mengkarakterisasi karakteristik kinerja mereka yang tepat tentunya terlalu sulit untuk diganggu.
dfeuer