Tôi đang tìm kiếm một "Danh sách" với log (N) chèn/xóa tại chỉ số i. Tôi đặt từ "Danh sách" trong dấu ngoặc kép, bởi vì tôi không có nghĩa nó là một danh sách Haskell thực sự, nhưng chỉ bất kỳ thùng chứa có thứ tự với một loạt các đối tượng (trên thực tế, nó có thể cần một số loại cây trong nội bộ). Tôi ngạc nhiên rằng tôi chưa tìm được giải pháp tuyệt vời nào ...."Danh sách" với hiệu quả chèn/xóa
Đây là giải pháp tốt nhất mà tôi có cho đến nay- Sử dụng Data.Sequence với hai hàm này.
doInsert position value seq = before >< (value <| after)
where
(before, after) = splitAt position seq
doDelete position seq = before >< (drop 1 after)
where
(before, after) = splitAt position seq
Trong khi đây là những kỹ thuật tất cả các log (N) chức năng, nó cảm thấy như tôi đang làm một loạt các công cụ bổ sung cho mỗi chèn/xóa .... Nói cách khác, điều này quy mô như K * log (N) cho một K lớn hơn mức cần thiết. Hơn nữa, vì tôi phải tự xác định thứ này, tôi cảm thấy mình đang dùng Sequence cho thứ gì đó mà nó không được thiết kế cho.
Có cách nào tốt hơn không?
Đây là một câu hỏi liên quan (mặc dù nó chỉ thoả thuận với Trình tự, tôi sẽ rất vui nếu sử dụng bất cứ điều gì khác): Why doesn't Data.Sequence have `insert' or `insertBy', and how do I efficiently implement them?
Và vâng, câu hỏi này có liên quan đến cái này khác tôi đăng tải cách đây vài ngày: Massive number of XML edits
lý do tại sao không [:: Data.Map.Map Int a] (http://www.haskell.org/ghc/docs/latest/html/libraries/containers/Data-Map-Lazy.html)? –
@ WillNess- chèn sẽ phải cập nhật tất cả 'i' cho các giá trị lớn hơn điểm chèn, vì vậy tôi không nghĩ rằng nó hoạt động. – jamshidh
giải pháp cấu trúc dữ liệu chuẩn cho IIRC này là một cây nơi các nút cũng mang số lượng phần tử bên trái của chúng. xem liệu http://vi.wikipedia.org/wiki/T-tree có liên quan hay không. –