Я не можу реально відповісти на №2, не загубившись (є занадто багато розмірів, за якими можна порівняти ці структури), але для №3 відповідь досить проста.
Використовуйте імперативну структуру даних, якщо: (a) немає абсолютно ніякого псевдоніму, або (b) вам дійсно потрібно використовувати псевдонім для ефективного мовлення.
Якщо взагалі немає згладжування вашої структури даних, ви не скористаєтесь тим, що функціональні структури даних є стійкими. Тож немає ніяких причин платити за їх вартість. На цю пораду є два застереження. По-перше, ви можете віддати перевагу простоті реалізації функціональної структури даних: реалізація видалення для функціонального червоно-чорного дерева змусить вас проклинати, але реалізація видалення в імперативному червоно-чорному дереві з батьківськими вказівниками залишить вас задуматися про самогубство. По-друге, призначення може бути дорожчим, ніж ви очікуєте на мові gc'd, оскільки записи можуть перенести структури даних з молодого покоління. У нас дійсно немає хорошої теорії кеш-ефектів і gc, тому у вас немає іншого вибору, як робити бенчмаркінг.
По-друге, якщо вам потрібен широкомовний канал, то спільна структура даних - це відмінний спосіб зробити це. Завдяки оновленню в постійному часі ви можете довільно сказати багатьом іншим людям, що значення змінилося. (Ось чому Union-find - це така чудова структура даних.) Завдяки суто функціональній установці вам потрібно змінити всіх інших людей або надати їм абстрактні вказівники на стан, який ви кодуєте вручну (що є свого роду тупим що робити).
Якщо ви або не хочете міркувати про згладжування та право власності на об’єкти, або якщо вам потрібні кілька версій однієї структури даних (скажімо, скажімо, як нова, так і стара версія), просто використовуйте функціональну структуру даних.
Місце, де я знаходжусь за цією порадою, найважче - з графічними алгоритмами. Існує безліч дійсно елегантних імперативних алгоритмів графіків, але часто буває так (скажімо, під час написання компіляторів), що ви також хочете наполегливості. Люди, як правило, намагаються розділити різницю і використовують крутий імперативний алгоритм, але намагаються перетворити версію на сторону, щоб отримати стійкість. Це, як правило, досить жахливо, багато помилок і схильне до втрати ефективності імперативного алгоритму.