Một vài năm trước, trong một C# Tất nhiên tôi đã học để viết một cây nhị phân mà nhìn nhiều hơn hoặc ít hơn như thế này:Trees với giá trị trên lá chỉ
data Tree a = Branch a (Tree a) (Tree a) | Leaf
tôi thấy lợi ích của nó, nó có giá trị của nó trên cành, cho phép tra cứu nhanh chóng và dễ dàng và chèn các giá trị, bởi vì nó sẽ gặp phải một giá trị trên gốc của mỗi nhánh xuống cho đến khi nó chạm vào một chiếc lá, không giữ giá trị.
Kể từ khi tôi bắt đầu học Haskell, tuy nhiên; Tôi đã thấy nhiều ví dụ về cây được xác định như sau:
data Tree a = Branch (Tree a) (Tree a) | Leaf a
Định nghĩa đó giải thích tôi. Tôi không thể nhìn thấy tính hữu ích của việc có số liệu về các yếu tố không chi nhánh, bởi vì nó sẽ kết thúc dẫn đến một cái cây trông như thế này:
nào với tôi, có vẻ như một thiết kế kém thay thế cho Danh sách. Nó cũng khiến tôi đặt câu hỏi về thời gian tra cứu của nó, vì nó không thể lừa được nhánh nào đi xuống để tìm giá trị mà nó đang tìm kiếm; nhưng thay vào đó cần phải đi qua mọi nút để tìm những gì nó đang tìm kiếm.
Vì vậy, bất kỳ ai cũng có thể làm sáng tỏ lý do tại sao phiên bản thứ hai (giá trị trên lá) lại phổ biến hơn nhiều trong Haskell so với phiên bản đầu tiên?
chắc chắn bạn có thể làm điều đó trong C#, và nó cũng khá dễ dàng; nếu bạn biết làm thế nào anyway –
Họ chỉ đơn giản là hai cấu trúc dữ liệu khác nhau với có lẽ sử dụng khác nhau, lợi thế, bất lợi (và có lẽ không). Ví dụ, 'Data.IntMap' là dạng thứ hai (chỉ dữ liệu trên các lá) và' Data.Map' là của dữ liệu cũ. Điểm của cả hai là gì? Tài liệu này có nghĩa là: "[IntMap] thực hiện đặc biệt tốt trên các hoạt động nhị phân như công đoàn và giao lộ. Tuy nhiên, điểm chuẩn của tôi cho thấy rằng cũng nhanh hơn khi chèn và xóa khi so sánh với [Data.Map]". Cuối cùng, tôi sẽ không nói rằng phiên bản thứ hai là "phổ biến hơn nhiều". – user2407038