Tôi có thể thấy các câu trả lời được đề xuất tập trung vào hiệu suất. Bài viết được cung cấp dưới đây không cung cấp bất kỳ điều gì mới về hiệu suất, nhưng nó giải thích các cơ chế cơ bản. Cũng lưu ý rằng nó không tập trung vào ba Collection
Loại được đề cập trong câu hỏi, nhưng giải quyết tất cả các Loại của System.Collections.Generic
không gian tên.
http://geekswithblogs.net/BlackRabbitCoder/archive/2011/06/16/c.net-fundamentals-choosing-the-right-collection-class.aspx
Trích xuất:
Từ điển <>
Từ điển có lẽ là lớp chứa kết hợp được sử dụng nhiều nhất. Từ điển là lớp nhanh nhất để tra cứu / chèn / xóa liên kết vì nó sử dụng bảng băm bên dưới . Vì các khóa được băm, nên loại khóa phải triển khai chính xác GetHashCode () và Equals () một cách thích hợp hoặc bạn nên cung cấp IEqualityComparer bên ngoài cho từ điển đang được xây dựng. Thời gian chèn / xóa / tra cứu các mục trong từ điển là thời gian không đổi được phân bổ - O (1) - có nghĩa là cho dù từ điển có lớn đến đâu thì thời gian cần thiết để tìm một thứ vẫn tương đối không đổi. Điều này rất mong muốn cho việc tra cứu tốc độ cao. Nhược điểm duy nhất là là từ điển, về bản chất sử dụng bảng băm, không có thứ tự, vì vậybạn không thể dễ dàng duyệt các mục trong Từ điển theo thứ tự .
SortedDictionary <>
SortedDictionary tương tự như Dictionary về cách sử dụng nhưng rất khác về cách thực hiện. Các SortedDictionary sử dụng một cây nhị phân dưới tấm chăn để duy trì các mục theo thứ tự kết thúc bằng phím . Như một hệ quả của việc sắp xếp, loại được sử dụng cho khóa phải triển khai chính xác IComp so sánh được để các khóa có thể được sắp xếp chính xác. Từ điển được sắp xếp đánh đổi một ít thời gian tra cứu để có khả năng duy trì các mục theo thứ tự, do đó thời gian chèn / xóa / tra cứu trong từ điển được sắp xếp là logarit - O (log n). Nói chung, với thời gian logarit, bạn có thể tăng gấp đôi kích thước của bộ sưu tập và nó chỉ phải thực hiện thêm một phép so sánh để tìm ra mục. Sử dụng SortedDictionary khi bạn muốn tra cứu nhanh nhưng cũng muốn duy trì bộ sưu tập theo thứ tự theo khóa.
SortedList <>
SortedList là lớp vùng chứa kết hợp được sắp xếp khác trong các vùng chứa chung. Một lần nữa SortedList, giống như SortedDictionary, sử dụng khóa để sắp xếp các cặp khóa-giá trị . Tuy nhiên, không giống như SortedDictionary, các mục trong SortedList được lưu trữ dưới dạng mảng các mục được sắp xếp. Điều này có nghĩa là việc chèn và xóa là tuyến tính - O (n) - vì việc xóa hoặc thêm một mục có thể liên quan đến việc chuyển tất cả các mục lên hoặc xuống trong danh sách. Tuy nhiên, thời gian tra cứu là O (log n) vì SortedList có thể sử dụng tìm kiếm nhị phân để tìm bất kỳ mục nào trong danh sách bằng khóa của nó. Vậy tại sao bạn lại muốn làm điều này? Chà, câu trả lời là nếu bạn tải lên trước SortedList, việc chèn sẽ chậm hơn, nhưng vì lập chỉ mục mảng nhanh hơn so với các liên kết đối tượng theo sau, nên việc tra cứu nhanh hơn một chút so với SortedDictionary. Một lần nữa, tôi sẽ sử dụng điều này trong các tình huống mà bạn muốn tra cứu nhanh và muốn duy trì bộ sưu tập theo thứ tự theo khóa và ở những nơi hiếm khi chèn và xóa.
Tóm tắt dự kiến về các thủ tục cơ bản
Phản hồi rất được hoan nghênh vì tôi chắc chắn rằng tôi đã không làm đúng mọi thứ.
- Tất cả các mảng đều có kích thước
n
.
- Mảng không được sắp xếp = .Add / .Remove là O (1), nhưng .Item (i) là O (n).
- Mảng đã sắp xếp = .Add / .Remove là O (n), nhưng .Item (i) là O (log n).
Từ điển
Ký ức
KeyArray(n) -> non-sorted array<pointer>
ItemArray(n) -> non-sorted array<pointer>
HashArray(n) -> sorted array<hashvalue>
Thêm vào
- Thêm
HashArray(n) = Key.GetHash
# O (1)
- Thêm
KeyArray(n) = PointerToKey
# O (1)
- Thêm
ItemArray(n) = PointerToItem
# O (1)
Tẩy
For i = 0 to n
, tìm i
nơi HashArray(i) = Key.GetHash
# O (log n) (mảng đã sắp xếp)
- Xóa
HashArray(i)
# O (n) (mảng đã sắp xếp)
- Xóa
KeyArray(i)
# O (1)
- Xóa
ItemArray(i)
# O (1)
Nhận hàng
For i = 0 to n
, tìm i
nơi HashArray(i) = Key.GetHash
# O (log n) (mảng đã sắp xếp)
- Trở về
ItemArray(i)
Vòng qua
For i = 0 to n
, trở về ItemArray(i)
SortedDictionary
Ký ức
KeyArray(n) = non-sorted array<pointer>
ItemArray(n) = non-sorted array<pointer>
OrderArray(n) = sorted array<pointer>
Thêm vào
- Thêm
KeyArray(n) = PointerToKey
# O (1)
- Thêm
ItemArray(n) = PointerToItem
# O (1)
For i = 0 to n
, tìm i
nơi KeyArray(i-1) < Key < KeyArray(i)
(sử dụng ICompare
) # O (n)
- Thêm
OrderArray(i) = n
# O (n) (mảng đã sắp xếp)
Tẩy
For i = 0 to n
, tìm i
nơi KeyArray(i).GetHash = Key.GetHash
# O (n)
- Xóa
KeyArray(SortArray(i))
# O (n)
- Xóa
ItemArray(SortArray(i))
# O (n)
- Xóa
OrderArray(i)
# O (n) (mảng đã sắp xếp)
Nhận hàng
For i = 0 to n
, tìm i
nơi KeyArray(i).GetHash = Key.GetHash
# O (n)
- Trở về
ItemArray(i)
Vòng qua
For i = 0 to n
, trở về ItemArray(OrderArray(i))
SortedList
Ký ức
KeyArray(n) = sorted array<pointer>
ItemArray(n) = sorted array<pointer>
Thêm vào
For i = 0 to n
, tìm i
ở đâu KeyArray(i-1) < Key < KeyArray(i)
(sử dụng ICompare
) # O (log n)
- Thêm
KeyArray(i) = PointerToKey
# O (n)
- Thêm
ItemArray(i) = PointerToItem
# O (n)
Tẩy
For i = 0 to n
, tìm i
nơi KeyArray(i).GetHash = Key.GetHash
# O (log n)
- Xóa
KeyArray(i)
# O (n)
- Xóa
ItemArray(i)
# O (n)
Nhận hàng
For i = 0 to n
, tìm i
nơi KeyArray(i).GetHash = Key.GetHash
# O (log n)
- Trở về
ItemArray(i)
Vòng qua
For i = 0 to n
, trở về ItemArray(i)