2012-03-18 34 views
16

Tôi cần trình bày một bộ và tôi bắt đầu làm việc với Data.Set. Tôi thấy rằng không có gì để làm thực sự - singleton, union, intersection, vv là tất cả chỉ có. Tôi thích nó. Tôi có thể diễn tả "cái gì", không phải "làm sao". Nhưng lập trình viên bên trong C của tôi là không thoải mái. Có rất nhiều cách để thực hiện một tập hợp (cây nhị phân, băm, mảng boolean, vv) Tôi có thể thực sự tin tưởng Data.Set để chọn tốt nhất? Tôi có thể hướng dẫn nó theo một cách nào đó hay tôi chỉ đầu hàng trước phán quyết của mình (tôi thừa nhận, có lẽ cao hơn)?Data.Set: nó luôn luôn biết tốt nhất?

+0

Đi với tùy chọn 2, đặc biệt nếu điều này là để sử dụng trong mã sản xuất. – Shredderroy

Trả lời

19

Data.Set không có thông tin tình báo bên trong (chỉ cần xem the source!). Nó chỉ là một cây cân bằng hoặc các yếu tố được sắp xếp. Bạn có thể xem xung quanh về hackage cho nhiều cấu trúc khác và thiết lập giống như với các đặc tính hiệu suất khác nhau. Ví dụ: xem unordered-containers (HashSet), HashTablesbloomfilter.

+0

OK, cảm ơn. Tôi đoán một câu hỏi tiếp theo là - có, hoặc sẽ có, một 'Data.Set' có thể được tin cậy để thực hiện một số các lựa chọn thực hiện cho người gọi? tức là khi được thông báo rằng tên miền chỉ là [1..8], nó sẽ chỉ ra rằng nó chỉ có thể sử dụng một byte? – gcbenison

+0

Xem tất cả các giá trị được đóng hộp, bạn sẽ không thể sử dụng nó chỉ bằng một byte. Làm thế nào bạn sẽ thực hiện điều đó trong Haskell? Tôi đoán bạn sẽ kiểm tra giá trị của đầu vào và thiết lập bit trong 'Word8' của bạn bằng tay sau đó phải phân bổ một giá trị đóng hộp cho mỗi tra cứu? Không giống như một màn trình diễn giành chiến thắng với tôi. –

+0

Có vẻ như bạn vẫn có thể thực hiện các so sánh bình đẳng mà không có bất kỳ phân bổ nào, và có lẽ là các công đoàn và các giao lộ chỉ với một phân bổ của một Word8. – gcbenison

18

Tổng quát Data.Set sử dụng cây nhị phân cân bằng. Nếu bạn có bộ số nguyên hoặc bit vectơ, bạn sẽ muốn Data.IntSet, sử dụng thử Patricia.

Cả hai triển khai đã được mài giũa qua năm cạnh tranh để có được hiệu suất tốt nhất có thể với Haskell.

Đầu hàng Dorothy!

+2

Điều này kết hợp với câu trả lời của Thomas cùng nhau tạo thành một câu trả lời tốt. 'Data.Set' rất tuyệt, có giao diện tuyệt vời và đủ nhanh trong hầu hết các trường hợp (tốt hơn nhiều so với những gì chúng ta có thể cuộn bằng tay), nhưng (giống như mọi thứ) nó sẽ không giải quyết mọi vấn đề một cách tối ưu. Đừng lo lắng về nó cho đến khi bạn cần; khi bạn làm, hãy xem một số thư viện khác. – luqui

+0

@luqui Tôi nghĩ rằng khi bạn có bộ số nguyên, nó đáng đi thẳng đến 'Data.IntSet'. –

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