2011-09-02 21 views
7

Các documentation của Data.Array đọc:Tốc độ nhanh như thế nào là Data.Array?

Haskell cung cấp mảng lập chỉ mục, trong đó có thể được coi như chức năng có tên miền đẳng cấu với tập con giáp của số nguyên. Các chức năng bị hạn chế theo cách này có thể được thực hiện một cách hiệu quả; cụ thể, một lập trình viên có thể mong đợi một cách hợp lý việc truy cập nhanh chóng vào các thành phần này một cách hợp lý.

Tôi tự hỏi làm thế nào nhanh chóng có thể (!)(//). Tôi có thể mong đợi O (1) phức tạp từ những điều này, như tôi sẽ có từ các đối tác cấp thiết của họ?

Trả lời

5

Nói chung, có, bạn sẽ có thể mong đợi O (1) từ ! mặc dù tôi không chắc chắn nếu điều đó được đảm bảo theo tiêu chuẩn.

Bạn có thể muốn xem gói vectơ nếu bạn muốn mảng nhanh hơn (thông qua sử dụng kết hợp luồng). Nó cũng được thiết kế tốt hơn.

Lưu ý rằng // có lẽ là O (n) mặc dù vì nó phải duyệt qua danh sách (giống như chương trình bắt buộc). Nếu bạn cần nhiều đột biến, bạn có thể sử dụng MArray hoặc MVector.

+1

'(//)' thực sự là linar trong _size của mảng_, vì nó phải tạo một bản sao mới của mảng. Tuy nhiên, khi sử dụng các mảng có thể thay đổi, tôi cho rằng nó sẽ là tuyến tính trong số lượng các bản cập nhật. – hammar

+0

@hammar nó là tuyến tính trong cả hai, vì nó phải sao chép mảng cũng như lặp qua danh sách. // là khá vô ích, mặc dù, trong một MArray bởi vì bạn không cần chức năng cập nhật hàng loạt. – alternative

+0

Có, tất nhiên. Tuy nhiên, điều đó chỉ thực sự quan trọng nếu bạn đang cập nhật một số phần tử nhiều lần. – hammar

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