Saya benar-benar tidak dapat menjawab # 2 tanpa tersesat (ada terlalu banyak dimensi di mana Anda dapat membandingkan struktur ini), tetapi untuk # 3 jawabannya cukup sederhana.
Gunakan struktur data imperatif jika: (a) sama sekali tidak ada alias, atau (b) Anda benar-benar perlu menggunakan alias untuk siaran yang efisien.
Jika tidak ada alias struktur data sama sekali, maka Anda tidak mengambil keuntungan dari fakta bahwa struktur data fungsional bersifat persisten. Jadi tidak ada alasan untuk membayar biayanya. Ada dua peringatan untuk saran ini. Pertama, Anda mungkin lebih suka kesederhanaan implementasi struktur data fungsional: menerapkan penghapusan untuk pohon merah-hitam fungsional akan membuat Anda mengutuk, tetapi menerapkan penghapusan di pohon merah-hitam imperatif dengan pointer orangtua akan membuat Anda berpikir untuk bunuh diri. Kedua, penugasan bisa lebih mahal dari yang Anda harapkan dalam bahasa gc'd, karena menulis bisa membuat struktur data dipindahkan dari generasi muda. Kami benar-benar tidak memiliki teori efek cache dan gc yang baik, jadi Anda tidak punya pilihan selain melakukan benchmarking.
Kedua, jika Anda membutuhkan saluran siaran, maka struktur data bersama adalah cara terbaik untuk melakukannya. Dengan pembaruan waktu-konstan, Anda dapat memberi tahu banyak orang secara sewenang-wenang bahwa suatu nilai telah berubah. (Inilah sebabnya mengapa union-find adalah struktur data yang hebat.) Dengan pengaturan yang murni fungsional, Anda perlu memodifikasi semua orang lain, atau memberi mereka pointer abstrak ke dalam keadaan yang Anda kode secara manual (yang merupakan jenis tumpul sesuatu yang harus dikerjakan).
Jika Anda tidak ingin beralasan tentang aliasing dan kepemilikan objek, atau jika Anda memerlukan beberapa versi dari struktur data yang sama (katakanlah Anda membutuhkan versi baru dan lama, katakanlah), maka gunakan saja struktur data fungsional.
Tempat di mana saya menemukan mengikuti saran ini yang paling sulit adalah dengan algoritma grafik. Ada banyak algoritma grafik imperatif yang benar-benar elegan, tetapi sering kali terjadi (misalnya, saat menulis kompiler) Anda juga ingin kegigihan. Orang-orang biasanya mencoba untuk membagi perbedaan dan menggunakan algoritma imperatif keren tetapi mencoba untuk mengaitkan versi ke samping untuk mendapatkan kegigihan. Ini umumnya cukup mengerikan, penuh bug, dan cenderung kehilangan keunggulan kinerja dari algoritma imperatif.