Came qua câu hỏi này tốt, mà là tương tự nhưng không phải ở tất cả cùng vì nó nói về Java, trong đó có thực hiện khác nhau của hash-bàn, nhờ có đồng bộ accessor/mutators Differences between HashMap and Hashtable?sự khác nhau giữa set và unordered_set trong C++ là gì?
Vì vậy, sự khác biệt là gì trong C++ thực hiện thiết lập và unordered_set? Câu hỏi này có thể là ofcourse mở rộng đến bản đồ vs unordered_map và như vậy cho các thùng chứa C++ khác.
Dưới đây là đánh giá ban đầu của tôi
thiết: Trong khi doesnt tiêu chuẩn yêu cầu một cách rõ ràng nó được thực hiện như cây, hạn chế thời gian phức tạp yêu cầu hoạt động của nó đối với find/chèn, có nghĩa là nó sẽ luôn luôn được thực hiện như cây. Thông thường như cây RB (như đã thấy trong GCC 4.8), được cân bằng chiều cao. Vì họ là chiều cao cân, họ có thể dự đoán được thời gian phức tạp cho find()
Ưu điểm: Nhỏ gọn (so với DS khác so)
Côn: Truy cập thời gian phức tạp là O (lg n)
unordered_set: Trong khi chuẩn không rõ ràng yêu cầu nó được thực hiện như cây, ràng buộc phức tạp về thời gian được yêu cầu cho hoạt động tìm/chèn, nghĩa là nó sẽ luôn được triển khai dưới dạng bảng băm.
Ưu điểm:
- nhanh hơn (lời hứa trả dần O (1) cho tìm kiếm)
- dễ dàng để chuyển đổi nguyên thủy cơ bản để thread-safe, so với cây DS
Nhược điểm:
- Tra cứu không được đảm bảo là O (1) Trường hợp xấu nhất có tính chất Therotical là O (n)
- Không nhỏ gọn như cây. (cho các yếu tố tải trọng mục đích thực tế là không bao giờ 1)
Lưu ý: O (1), cho hashtable đến từ giả định rằng không có va chạm. Ngay cả với hệ số tải là 0,5, mọi biến chèn thứ hai đều dẫn đến va chạm. Có thể quan sát thấy rằng hệ số tải của bảng băm tỷ lệ nghịch với số lượng hoạt động cần thiết để truy cập vào một phần tử trong đó. Chúng tôi càng giảm # hoạt động, bảng băm nhỏ hơn. Khi phần tử được lưu trữ có kích thước tương đương với con trỏ, thì chi phí trên là khá đáng kể.
Chỉnh sửa: Vì phần lớn câu hỏi có chứa câu trả lời đầy đủ, tôi thay đổi câu hỏi thành "Tôi có bỏ sót bất kỳ sự khác biệt nào giữa bản đồ/tập hợp để phân tích hiệu suất mà một người nên biết không?"
Các phần tử của tập hợp 'std :: set' phải được chuyển ngang theo một thứ tự cụ thể.Đây là lý do thực tế tại sao các thao tác chèn, tra cứu và loại bỏ là 'O (lg n)'. – pyon
@ EduardoLeón: Tôi nghĩ O (lg n), là tác dụng phụ của cây như DS. Điều đó cũng sẽ giải thích các mục có thứ tự nhất định khi đi ngang qua. Tôi không chắc chắn, nhưng tôi không biết 'thứ tự cụ thể' là yêu cầu cho 'set' trong C++. Tôi có thể sai. –
"* Tra cứu không được bảo đảm là O (1) Trường hợp xấu nhất về mặt pháp lý là O (n) *" Đó không phải là quá nhiều "con" như là "bạn không biết cách viết hàm băm". –