Tại sao không có lớp Tree <T> trong .NET?


87

Thư viện lớp cơ sở trong .NET có một số cấu trúc dữ liệu tuyệt vời cho các bộ sưu tập (Danh sách, Hàng đợi, Ngăn xếp, Từ điển), nhưng kỳ lạ là nó không chứa bất kỳ cấu trúc dữ liệu nào cho cây nhị phân. Đây là một cấu trúc cực kỳ hữu ích cho các thuật toán nhất định, chẳng hạn như những thuật toán tận dụng các đường đi ngang khác nhau. Tôi đang tìm kiếm một văn bản chính xác, triển khai miễn phí.

Tôi chỉ đơn giản là bị mù, và không tìm thấy nó ... nó được chôn ở đâu đó trong BCL? Nếu không, ai đó có thể giới thiệu thư viện C # /. NET miễn phí hoặc mã nguồn mở cho cây nhị phân không? Tốt hơn là một trong đó sử dụng generic.

CHỈNH SỬA: Để làm rõ những gì tôi đang tìm kiếm. Tôi không quan tâm đến các bộ sưu tập từ điển được sắp xếp sử dụng nội bộ một cây. Tôi thực sự quan tâm đến cây nhị phân - cây hiển thị cấu trúc của nó để bạn có thể thực hiện những việc như trích xuất các cây con hoặc thực hiện duyệt sau sửa chữa trên các nút. Lý tưởng nhất là một lớp như vậy có thể được mở rộng để cung cấp các hành vi của các cây chuyên biệt (ví dụ: Đỏ / Đen, AVL, Cân bằng, v.v.).


Đã đồng ý. Tôi thỉnh thoảng có nhu cầu tìm (trong thời gian O (Log N)) hai nút ràng buộc một giá trị (khi giá trị không được tìm thấy trong bộ sưu tập). Ví dụ: bộ sưu tập (cây) chứa 13 và 17 (trong số những cái khác) và tôi đang tìm giá trị lớn nhất nhỏ hơn và ít nhất lớn hơn 16. Một cây có thể làm được điều này, nhưng Từ điển, danh sách được sắp xếp và bảng băm lấy O (N) .
Les

Câu trả lời:


31

Bạn nói đúng, không có gì trong BCL. Tôi nghi ngờ điều này là do việc lựa chọn có sử dụng cây thường là chi tiết triển khai hay không và là một cách độc đáo để truy cập dữ liệu. Đó là, bạn không nói, "tìm kiếm nhị phân cho phần tử # 37"; thay vào đó, bạn nói, "lấy cho tôi phần tử số 37".

Nhưng bạn đã xem qua C5 chưa? Nó siêu tiện dụng và chúng có một số triển khai dạng cây ( 1 , 2 , 3 ).


3
C5 hỗ trợ cây Đỏ đen không phải cây B. Chúng là những điểm khác biệt mà mọi người nên biết. B-Tree tối ưu hơn cho cây dựa trên đĩa hoặc cây dựa trên bộ nhớ lớn. Nhiều nút hơn được giữ trong cùng một địa phương để bạn có được hiệu suất bộ nhớ cache của bộ xử lý tốt hơn và đọc ghi vào đĩa nhanh hơn.
AnthonyLambert

68

Bạn có thể xác định của riêng bạn:

public class MyTree<K, V> : Dictionary<K, MyTree<K, V>>
{
    public V Value { get; set; }
}

Hoặc bỏ khóa:

public class MyTree<V> : HashSet<MyTree<V>>
{
    public V Value { get; set; }
}

Tuy nhiên, điều này đòi hỏi bạn phải biết bạn sẽ xử lý bao nhiêu cấp độ cây tại thời điểm biên dịch, tôi có nhầm không?
Veverke

1
Không, trình biên dịch C # hỗ trợ cú pháp này.
Jason

2
Ghi chú rằng yếu tố này được bỏ lệnh cách này
Sebastian

@Veverke Có lẽ bạn đang nghĩ đến các mẫu C ++. .NET chung là các loại thời gian chạy.
Tom Blodget,

Tôi tò mò. bạn sử dụng cái này như thế nào? Thực tế? Bất kỳ mẫu?
Syaiful Nizam Yahya

39

Bạn muốn gì từ việc triển khai như vậy?

Cây nhị phân? Đỏ đen? Cây xạ hương? B-cây? Cây R? R * - ba?

Cây là một mẫu hơn là một cấu trúc dữ liệu và chúng có xu hướng được sử dụng ở những nơi quan trọng về hiệu suất (vì vậy chi tiết triển khai có thể cũng quan trọng). Nếu BCL bao gồm một số loại lớp cây, bạn chỉ phải tự cuộn


1
Câu trả lời tốt nhất cho phần "tại sao" của câu hỏi.
Joel Coehoorn

Và đó chỉ là những cây tìm kiếm. Ngoài ra còn có cây biểu thức, quyết định tress, ...
Henk Holterman

Thật vậy, các chi tiết thực hiện quan trọng. Trong trường hợp của tôi, tôi đang tìm cách triển khai một số thuật toán sẽ thực hiện các chuyển tải khác nhau (infix, postfix) trên một tập hợp dữ liệu có tổ chức như một phần của một loạt các phép biến đổi. Cấu trúc cây là cách tốt nhất để giải quyết vấn đề của tôi.
LBushkin

11
Trong một vũ trụ song song, ai đó đang đặt câu hỏi: "Tại sao không có loại danh sách nào trong .Net?" Và họ nhận được câu trả lời: "Bạn muốn gì từ việc triển khai như vậy? Một mảng? Một danh sách được liên kết? Một hàng đợi? A từ điển? " Tôi nghĩ đây là một câu trả lời không theo trình tự.
rymdsmurf


12

SortedSet<T>được triển khai dưới dạng cây tìm kiếm nhị phân ref . SortedDictionary<TKey, TValue>nội bộ sử dụng SortedSet<T>vì vậy nó cũng là một cây tìm kiếm nhị phân ref .


5
Thật không may, đây chỉ đơn giản là triển khai các bản đồ và danh sách có thứ tự. Không hữu ích cho việc sử dụng lại dưới dạng cây nhị phân - các cấu trúc cây này chỉ đơn giản là một chi tiết triển khai của bộ sưu tập. Tôi thực sự đang tìm một lớp thể hiện cấu trúc cây.
LBushkin

9

Không, không có bất kỳ kiểu " Tree<T>-like" nào trong BCL (điều gì đó luôn khiến tôi bối rối) nhưng đây là một bài viết hay sẽ hướng dẫn bạn cách triển khai kiểu của riêng bạn trong C #.

Tôi đoán bạn có thể đưa ra lập luận rằng cấu trúc dữ liệu dựa trên cây ít được sử dụng hơn trong loại ứng dụng mà .NET thường được sử dụng (ứng dụng kinh doanh, ứng dụng di chuyển dữ liệu, v.v.). Tuy nhiên, tôi đồng ý với bạn, thật kỳ lạ là BCL không có sự thực hiện nào cả.



-5

Có một TreeNode bạn có thể sử dụng. Nó không chung chung và ẩn trong các biểu mẫu cửa sổ và được sử dụng với điều khiển treeview, nhưng bạn cũng có thể sử dụng nó ở những nơi khác.


Vâng, nhưng nó chỉ có thuộc tính Thẻ của ype System.Object. Không Generic <T> tham số
Henk Holterman

3
Tôi luôn cảm thấy kỳ lạ khi làm những việc như vậy. Nó ít hiển thị hơn với ví dụ cụ thể của bạn, nhưng nếu mọi người thường xuyên chuyển mục đích lại các lớp từ các phần phụ thuộc, điều này có thể dẫn đến các phần phụ thuộc khó giải thích và có thể khiến bạn gặp rắc rối nếu lớp được định hướng lại thay đổi theo cách không mong muốn. các phiên bản phụ thuộc.
Paul Morie

4
Lợi nhuận của việc sử dụng nó là gì? Một nút cây thường không có bất kỳ chức năng liên quan nào trong đó. Nó chỉ chứa các tham chiếu đến con cái và cuối cùng là cha mẹ. Không có lý do gì để sử dụng sai lớp System.Windows.Forms cho nó! Chỉ cần tự viết nó - trong một phút hoặc ít hơn.
user492238
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.