2012-03-22 17 views
5

Là bài tập tôi đã viết an implementation của longest increasing subsequence algorithm, ban đầu bằng Python nhưng tôi muốn dịch thành Haskell. Tóm lại, thuật toán liên quan đến một danh sách các số nguyên, trong đó kết quả của mỗi lần lặp là một dãy số nguyên là kết quả của việc thay đổi một phần tử hoặc nối thêm một phần tử vào kết quả trước đó.Tìm kiếm cấu trúc giống như mảng hỗ trợ "thay thế một thành viên" và "nối thêm"

Tất nhiên trong Python bạn chỉ có thể thay đổi một phần tử của mảng. Trong Haskell, bạn có thể xây dựng lại mảng trong khi thay thế một phần tử tại mỗi lần lặp - nhưng điều đó có vẻ lãng phí (sao chép hầu hết các mảng tại mỗi lần lặp).

Nói tóm lại những gì tôi đang tìm kiếm là một hiệu quả Haskell cấu trúc dữ liệu đó là một bộ sưu tập lệnh của 'n' đối tượng và hỗ trợ các hoạt động: lookup i, replace i foo, và append foo (nơi i là trong [0..n- 1]). Gợi ý?

+0

Bạn chỉ có thể sử dụng một mảng có thể thay đổi. Tôi đã có kinh nghiệm tốt với [MVector] (http://hackage.haskell.org/packages/archive/vector/0.9.1/doc/html/Data-Vector.html#t:MVector). – rampion

+1

MVector có O (n) chắp thêm/khuyết điểm/snoc. –

+2

Tại sao bạn cần 'append'? Kích thước cuối cùng được biết ngay từ đầu. –

Trả lời

4

Có lẽ loại tiêu chuẩn Seq từ Data.Sequence. Nó không phải khá O (1), nhưng đó là khá tốt:

  • index (bạn lookup) và adjust (bạn replace) là O (log (min (index,   dài  -  index)))

  • (><) (bạn append) là O (log (min (length1, 0.123.length2)))

Nó dựa trên một cấu trúc cây (đặc biệt, một cây 2-3 ngón tay), vì vậy nó phải có tính chất chia sẻ tốt (nghĩa là nó sẽ không sao chép toàn bộ chuỗi cho sửa đổi gia tăng, và sẽ thực hiện chúng nhanh hơn quá). Lưu ý rằng Seq s rất nghiêm ngặt, không giống như danh sách.

+1

'Seq 'về cơ bản là cách tốt nhất để làm điều này trừ khi bạn sẵn sàng làm việc trong' IO' hoặc 'ST'. –

3

Tôi sẽ cố gắng chỉ sử dụng các mảng có thể thay đổi trong trường hợp này, tốt nhất là trong đơn vị ST.

Ưu điểm chính sẽ làm cho bản dịch trở nên đơn giản hơn và làm cho mọi việc trở nên đơn giản và hiệu quả.

Những bất lợi, tất nhiên, đang mất đi độ tinh khiết và tính tương thích. Tuy nhiên tôi nghĩ rằng đây không phải là một vấn đề lớn vì tôi không nghĩ có nhiều trường hợp bạn muốn giữ các thuật toán trung gian xung quanh.

+0

Trang này sẽ cho bạn biết bạn nên sử dụng loại mảng nào và trong những trường hợp nào: http://www.haskell.org/haskellwiki/Arrays Ngoài ra, cảm ơn nhiều, @missingno –

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