Tôi thực sự không thể trả lời # 2 mà không bị lạc (có quá nhiều thứ mà bạn có thể so sánh các cấu trúc này), nhưng với # 3, câu trả lời khá đơn giản.
Sử dụng cấu trúc dữ liệu bắt buộc nếu: (a) hoàn toàn không có bí danh hoặc (b) bạn thực sự cần sử dụng bí danh để phát sóng hiệu quả.
Nếu không có bí danh nào về cấu trúc dữ liệu của bạn, thì bạn không lợi dụng thực tế là các cấu trúc dữ liệu chức năng vẫn tồn tại. Vì vậy, không có lý do để trả cho chi phí của họ. Có hai hãy cẩn thận với lời khuyên này. Trước tiên, bạn có thể thích sự đơn giản của việc thực hiện cấu trúc dữ liệu chức năng: thực hiện xóa đối với cây đỏ đen chức năng sẽ khiến bạn nguyền rủa, nhưng thực hiện xóa trong cây đen đỏ bắt buộc với con trỏ cha mẹ sẽ khiến bạn phải tự tử. Thứ hai, sự phân công có thể tốn kém hơn bạn mong đợi trong ngôn ngữ gc'd, vì việc ghi có thể khiến các cấu trúc dữ liệu bị loại bỏ khỏi thế hệ trẻ. Chúng tôi thực sự không có một lý thuyết tốt về hiệu ứng bộ đệm và gc, vì vậy bạn không có lựa chọn nào khác ngoài việc làm điểm chuẩn.
Thứ hai, nếu bạn cần một kênh phát sóng, thì cấu trúc dữ liệu được chia sẻ là một cách tuyệt vời để làm điều đó. Với cập nhật liên tục, bạn có thể tùy ý nói với nhiều người khác rằng giá trị đã thay đổi. (Đây là lý do tại sao union-find là một cấu trúc dữ liệu tuyệt vời như vậy.) Với thiết lập chức năng thuần túy, bạn cần phải sửa đổi tất cả những người khác hoặc cung cấp cho họ các con trỏ trừu tượng vào trạng thái bạn mã hóa thủ công (đây là một loại khó hiểu việc cần làm).
Nếu bạn không muốn lý do về bí danh và quyền sở hữu đối tượng hoặc nếu bạn cần nhiều phiên bản của cùng một cấu trúc dữ liệu (bạn cần cả phiên bản mới và phiên bản cũ, thì chỉ cần sử dụng cấu trúc dữ liệu chức năng.
Nơi tôi tìm thấy theo lời khuyên này khó nhất là với các thuật toán đồ thị. Có rất nhiều thuật toán đồ thị mệnh lệnh thực sự thanh lịch, nhưng thường thì (giả sử, khi viết trình biên dịch) mà bạn cũng muốn kiên trì. Mọi người thường cố gắng phân chia sự khác biệt và sử dụng thuật toán mệnh lệnh tuyệt vời nhưng cố gắng đẩy phiên bản sang một bên để có được sự kiên trì. Điều này nói chung là khá khủng khiếp, đầy lỗi và dễ bị mất lợi thế về hiệu suất của thuật toán bắt buộc.