Bảng liệt kê phạm vi không thay đổi


11

Tôi đã đọc về C # 's ImmutableSortedDictionarytrong System.Collections.Immutablevà suy nghĩ về làm thế nào để áp dụng nó trong chương trình của tôi. Tôi khá thích C ++ lower_boundupper_bound(xem ở đây ), và tôi đã mong đợi được thấy thứ gì đó tương tự cho việc tra cứu phạm vi. Tuy nhiên, các phương pháp tương tự dường như vắng mặt một cách kỳ lạ trong tài liệu . Tui bỏ lỡ điều gì vậy? Hay MS thực sự cung cấp một từ điển được sắp xếp mà không có quyền truy cập hiệu quả vào các phạm vi được sắp xếp? Điều đó không chính xác giống như một cái gì đó mà người ta có thể làm trên một IEnumerablephím như nói một phương thức mở rộng, vì vậy tôi hơi bối rối Tôi không thấy thứ gì được cung cấp trực tiếp bởi bộ sưu tập.


Eric Lippert đã chia sẻ một triển khai cây AVL bất biến vào năm 2008. Từ các bình luận, tôi không nghĩ nó được tối ưu hóa đặc biệt cho tốc độ hay hiệu quả, nhưng IBinarySearchTree<K,V>nó thực hiện gần hơn với những gì tôi mong đợi. Tôi tự hỏi nếu anh ấy đã từng mày mò về nó hơn nữa?
J Trana

Các ImmutableList<T>lớp học cũng được thực hiện như một cây AVL. Từ mã nguồn :/// The root node of the AVL tree that stores this set.
Theodor Zoulias

Bạn có biết nếu chúng có nghĩa là danh sách sử dụng AVL true để thực hiện tính bất biến hoặc nếu bản thân cây AVL là bất biến? (có lẽ điều đó không quan trọng vì dù sao họ cũng không phơi cây).
J Trana

Dưới đây là những lợi thế của ImmutableList<T>(được hỗ trợ bởi cây AVL) so với ImmutableArray<T>(được hỗ trợ bởi một mảng), theo tài liệu . Lý do nên sử dụng danh sách không thay đổi: 1) Cập nhật dữ liệu là phổ biến hoặc số lượng phần tử không được mong đợi là nhỏ. 2) Cập nhật bộ sưu tập có hiệu suất quan trọng hơn việc lặp lại nội dung.
Theodor Zoulias

Điều này là do khi thêm hoặc xóa một phần tử khỏi cây AVL lớn, bạn có thể lấy một cây mới mà không phá hủy cây ban đầu, bằng cách chia sẻ hầu hết các nút và chỉ tạo một vài nút mới. ( Cấu trúc dữ liệu liên tục - Cây xanh )
Theodor Zoulias

Câu trả lời:


9

Thật khó chịu khi các bộ sưu tập tích hợp sẵn không cung cấp một bộ đầy đủ các tính năng (như SortedDictionarythiếu BinarySearchphương pháp), buộc chúng tôi phải tìm kiếm các giải pháp của bên thứ ba (như thư viện C5 ).

Trong trường hợp của bạn thay vì ImmutableSortedDictionarybạn có thể sử dụng một ImmutableSortedSet, nhúng các giá trị trong các khóa và sử dụng một bộ so sánh thích hợp. Ít nhất API của lớp này chứa các thuộc tính MinMax.


2
Như một lưu ý phụ, một lớp bất biến khác, the ImmutableList<T>, được thực hiện bên trong như một cái cây . Vì vậy, nó chậm hơn 10 lần và phân bổ bộ nhớ nhiều hơn 12 lần so với a List<T>. Sử dụng ImmutableArray<T>thay thế.
Theodor Zoulias

1
Hehe, tôi đã sử dụng C5 rồi nhưng muốn xem những gì có sẵn cho các bộ sưu tập bất biến (ngoài ảnh chụp nhanh). Cảm ơn! Tôi sẽ giữ hy vọng rằng ai đó đã giải quyết điều này bằng một cách nào đó hình dạng hoặc hình thức, nhưng tôi sẽ ghi nhớImmutableSortedSet
J Trana

@TheodorZoulias Điểm cần có phương thức BinarySearch trong SortedDipedia, khi phương thức TryGetValue đang hoạt động trong log (N)? xem tại đây
Giorgi Chkhikvadze

2
@GiorgiChkhikvadze BinarySearch có thể cung cấp cho bạn phần tử tiếp theo lớn hơn mục bạn đang tìm kiếm, trong trường hợp không tìm thấy kết quả khớp chính xác.
Theodor Zoulias

1
@GiorgiChkhikvadze Có lẽ sự khác biệt lớn nhất ở đây là giá trị trả về không chỉ là một giá trị duy nhất trong bộ sưu tập, mà là một cách để lập chỉ mục vào bộ sưu tập một cách hiệu quả. Phương thức BinarySearch đặc biệt không chỉ bởi vì nó tìm thấy giá trị một cách hiệu quả mà bởi vì nó tìm thấy một chỉ mục ngay cả trong trường hợp bỏ lỡ như Theodor đã chỉ ra - cho phép truy cập nhanh vào ví dụ như một mảng. Trong trường hợp của một cây, một chỉ số nguyên có thể không phải là một cách hiệu quả để truy cập vào cấu trúc; C ++ giải quyết điều này thông qua việc sử dụng một đối tượng lặp (mặc dù có độ phức tạp riêng của nó).
J Trana
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.