2009-06-02 21 views
72

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ỳ quặc 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 hữu ích khủng khiếp cho các thuật toán nhất định, chẳng hạn như các thuật toán tận dụng các đường dẫn truyền tải khác nhau. Tôi đang tìm một cách thực hiện miễn phí, được viết chính xác.Tại sao không có lớp Tree <T> trong .NET?

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

EDIT: Để 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 theo thứ tự mà nội bộ sử dụng một cái cây. Tôi thực sự quan tâm đến một cây nhị phân - một cái để lộ cấu trúc của nó để bạn có thể làm những việc như trích xuất các subtrees, hoặc thực hiện các bước sau sửa lỗi trên các nút. Lý tưởng như vậy một lớp học có thể được mở rộng để cung cấp các hành vi của cây đặc biệt (ví dụ: Red/Black, AVL, Balanced, vv).

+0

còn LinkedList thì sao? –

+0

Đồng ý. Thỉnh thoảng tôi 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 người khác) và tôi đang tìm kiếm số lớn nhất lớn hơn và nhỏ hơn 16. Cây có thể làm đ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

Trả lời

26

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

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

+2

C5 hỗ trợ các cây Đỏ đen không phải B-Tree. Họ là những người 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 có bộ nhớ lớn. Nhiều nút hơn được giữ ở cùng một địa phương để bạn có được hiệu suất bộ nhớ cache tốt hơn và nhanh hơn để đọc ghi vào đĩa. – AnthonyLambert

8

Không, không có bất kỳ loại nào "Tree<T>" giống như trong BCL (điều gì đó luôn làm tôi bối rối) nhưng here is a good article sẽ hướng dẫn bạn thực hiện của riêng bạn trong C#.

Tôi đoán bạn có thể làm cho lập luận rằng cấu trúc dữ liệu dựa trên cây thường ít được sử dụng trong các loại ứng dụng .NET thường được sử dụng cho (ứ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 lạ lùng là BCL không có triển khai gì cả.

-5

Có một số TreeNode bạn có thể sử dụng. Nó không phải là chung chung và ẩn đi trong các hình thức cửa sổ và được sử dụng với các kiểm soát treeview, nhưng bạn có thể sử dụng nó ở nơi khác là tốt.

+0

Vâng, nhưng nó chỉ có một thuộc tính Tag của System.Object ype. Không có thông số chung

+1

Tôi luôn cảm thấy kỳ lạ khi làm những việc như thế. Nó ít nhìn thấy hơn với ví dụ cụ thể của bạn, nhưng nếu mọi người thường xuyên nhắm mục tiêu lại các lớp từ, phụ thuộc, điều này có thể dẫn đến sự 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 nghĩa lại thay đổi theo cách bất ngờ phiên bản phụ thuộc. –

+3

Lợi nhuận của việc sử dụng nó là gì? Nút cây thường không có bất kỳ chức năng liên quan nào trong đó. Nó chỉ giữ tài liệu tham khảo cho trẻ em và cuối cùng là một phụ huynh. Không có lý do gì để lạm dụng lớp System.Windows.Forms cho nó! Chỉ cần viết nó - trong một phút hoặc ít hơn. – user492238

12

SortedSet<T> được thực hiện như một cây tìm kiếm nhị phân ref. SortedDictionary<TKey, TValue> nội bộ sử dụng số SortedSet<T> để nó cũng là cây tìm kiếm nhị phân ref.

+5

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

35

Bạn muốn thực hiện điều gì như vậy?

Cây nhị phân? Đỏ đen? Cây Radix? B-tree? R-tree? R * -tree?

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

+1

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

+0

Và đó chỉ là những cây tìm kiếm. Ngoài ra còn có các cây biểu hiện, quyết định tress, ... –

+0

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 có thể thực hiện các traversals 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 thanh lịch nhất để giải quyết vấn đề của tôi. – LBushkin

65

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

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

Hoặc unkeyed:

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

Huh. Tài giỏi. :) – JerKimball

+2

Vâng, đó là thông minh. +1 –

+2

Đơn giản. Thiên tài. –

Các vấn đề liên quan