Hashset Cấu trúc dữ liệu C # Hashset được giới thiệu trong .NET Framework 3.5. Một danh sách đầy đủ của các thành viên được thực hiện có thể được tìm thấy tại trang MSDN Hashset .
- Nó được sử dụng ở đâu?
- Tại sao bạn muốn sử dụng nó?
Hashset Cấu trúc dữ liệu C # Hashset được giới thiệu trong .NET Framework 3.5. Một danh sách đầy đủ của các thành viên được thực hiện có thể được tìm thấy tại trang MSDN Hashset .
Câu trả lời:
A HashSet
giữ một tập hợp các đối tượng, nhưng theo cách nó cho phép bạn dễ dàng và nhanh chóng xác định xem một đối tượng đã có trong tập hợp hay chưa. Nó làm như vậy bằng cách quản lý nội bộ một mảng và lưu trữ đối tượng bằng cách sử dụng một chỉ mục được tính từ mã băm của đối tượng. Hãy xem ở đây
HashSet
là một bộ sưu tập không có thứ tự chứa các yếu tố độc đáo. Nó có các hoạt động thu thập tiêu chuẩn Thêm, Xóa, Chứa, nhưng vì nó sử dụng triển khai dựa trên hàm băm, nên các hoạt động này là O (1). (Trái ngược với Danh sách chẳng hạn, đó là O (n) cho Chứa và Xóa.) HashSet
Cũng cung cấp các thao tác thiết lập tiêu chuẩn như liên kết , giao nhau và chênh lệch đối xứng . Hãy xem ở đây
Có nhiều cách triển khai khác nhau của Bộ. Một số thực hiện thao tác chèn và tra cứu siêu nhanh bằng cách băm các phần tử. Tuy nhiên, điều đó có nghĩa là thứ tự các yếu tố được thêm vào bị mất. Các triển khai khác bảo toàn thứ tự được thêm vào với chi phí thời gian chạy chậm hơn.
Các HashSet
lớp trong C # đi cho cách tiếp cận đầu tiên, do đó không giữ gìn trật tự của các yếu tố. Nó nhanh hơn nhiều so với thông thường List
. Một số điểm chuẩn cơ bản cho thấy Hashset nhanh hơn khi xử lý các loại chính (int, double, bool, v.v.). Nó nhanh hơn rất nhiều khi làm việc với các đối tượng lớp. Vì vậy, điểm đó là Hashset nhanh.
Điều hấp dẫn duy nhất HashSet
là không có quyền truy cập của các chỉ số. Để truy cập các phần tử, bạn có thể sử dụng một điều tra viên hoặc sử dụng hàm tích hợp để chuyển đổi HashSet
thành một List
và lặp qua đó. Hãy xem ở đây
A HashSet
có cấu trúc bên trong (hàm băm), trong đó các mục có thể được tìm kiếm và xác định nhanh chóng. Nhược điểm là lặp đi lặp lại qua mộtHashSet
(hoặc nhận một mục theo chỉ mục) là khá chậm.
Vậy tại sao ai đó muốn có thể biết nếu một mục đã tồn tại trong một tập hợp?
Một tình huống trong đó HashSet
hữu ích là nhận được các giá trị riêng biệt từ danh sách nơi các bản sao có thể tồn tại. Khi một mục được thêm vào, HashSet
nó sẽ nhanh chóng xác định xem mục đó có tồn tại không ( Contains
toán tử).
Lợi thế khác của HashSet
là những hoạt động Set: IntersectWith
, IsSubsetOf
, IsSupersetOf
, Overlaps
, SymmetricExceptWith
, UnionWith
.
Nếu bạn quen thuộc với ngôn ngữ ràng buộc đối tượng thì bạn sẽ xác định các thao tác thiết lập này. Bạn cũng sẽ thấy rằng đó là một bước gần hơn để triển khai UML thực thi.
Nói một cách đơn giản và không tiết lộ bí mật nhà bếp:
một bộ nói chung, là một bộ sưu tập không chứa các yếu tố trùng lặp và các yếu tố của chúng không theo thứ tự cụ thể. Vì vậy, A HashSet<T>
tương tự như chung List<T>
, nhưng được tối ưu hóa để tra cứu nhanh (thông qua hashtables, như tên ngụ ý) với chi phí mất đơn hàng.
Từ góc độ ứng dụng, nếu chỉ cần tránh trùng lặp thì đó HashSet
là thứ bạn đang tìm kiếm vì nó Tra cứu, Chèn và Xóa độ phức tạp là O (1) - không đổi . Điều này có nghĩa là không quan trọng việc có bao nhiêu phần tử HashSet
sẽ mất cùng một khoảng thời gian để kiểm tra xem có phần tử đó hay không, cộng với việc bạn chèn các phần tử vào O (1) cũng làm cho nó hoàn hảo cho loại điều này.