Theo Pippenger [1996] , khi so sánh một hệ thống Lisp hoàn toàn có chức năng (và có ngữ nghĩa đánh giá nghiêm ngặt, không lười biếng) với một hệ thống có thể làm thay đổi dữ liệu, thuật toán được viết cho Lisp không tinh khiết chạy trong O ( n ) có thể được dịch với một thuật toán trong Lisp thuần chạy trong thời gian O ( n log n ) (dựa trên công việc của Ben-Amram và Galil [1992] về việc mô phỏng bộ nhớ truy cập ngẫu nhiên chỉ sử dụng con trỏ). Pippenger cũng thiết lập rằng có những thuật toán mà đó là điều tốt nhất bạn có thể làm; có những vấn đề là O ( n ) trong hệ thống không tinh khiết là ( n log n ) trong hệ thống thuần túy.
Có một vài cảnh báo được thực hiện về bài báo này. Điều quan trọng nhất là nó không giải quyết các ngôn ngữ chức năng lười biếng, chẳng hạn như Haskell. Bird, Jones và De Moor [1997] chứng minh rằng vấn đề do Pippenger xây dựng có thể được giải quyết bằng ngôn ngữ chức năng lười biếng trong thời gian O ( n ), nhưng họ không thiết lập (và theo như tôi biết, không ai có) dù có hay không không phải là một ngôn ngữ chức năng lười biếng có thể giải quyết tất cả các vấn đề trong cùng một thời gian chạy tiệm cận như một ngôn ngữ có đột biến.
Vấn đề được Pippenger xây dựng đòi hỏi Ω ( n log n ) được xây dựng cụ thể để đạt được kết quả này và không nhất thiết phải đại diện cho các vấn đề thực tế, thực tế. Có một vài hạn chế về vấn đề hơi bất ngờ, nhưng cần thiết để bằng chứng hoạt động; đặc biệt, vấn đề yêu cầu các kết quả được tính toán trực tuyến, mà không thể truy cập đầu vào trong tương lai và đầu vào bao gồm một chuỗi các nguyên tử từ một tập hợp các nguyên tử có thể, không phải là một tập hợp kích thước cố định. Và bài báo chỉ thiết lập kết quả (giới hạn dưới) cho một thuật toán không tinh khiết về thời gian chạy tuyến tính; đối với các sự cố đòi hỏi thời gian chạy lớn hơn, có thể là thêm O (log n) yếu tố được thấy trong bài toán tuyến tính có thể có thể được "hấp thụ" trong quá trình hoạt động thêm cần thiết cho các thuật toán có thời gian chạy lớn hơn. Những làm rõ và câu hỏi mở này được Ben-Amram [1996] khám phá ngắn gọn .
Trong thực tế, nhiều thuật toán có thể được thực hiện bằng một ngôn ngữ chức năng thuần túy với hiệu quả tương tự như trong một ngôn ngữ có cấu trúc dữ liệu có thể thay đổi. Để tham khảo tốt về các kỹ thuật sử dụng để thực hiện các cấu trúc dữ liệu chức năng thuần túy một cách hiệu quả, hãy xem "Cấu trúc dữ liệu chức năng thuần túy" của Chris Okasaki [Okasaki 1998] (đây là phiên bản mở rộng của luận án [Okasaki 1996] ).
Bất cứ ai cần thực hiện các thuật toán trên các cấu trúc dữ liệu thuần túy chức năng nên đọc Okasaki. Bạn luôn có thể làm chậm tốc độ O (log n ) trên mỗi thao tác bằng cách mô phỏng bộ nhớ có thể thay đổi với cây nhị phân cân bằng, nhưng trong nhiều trường hợp bạn có thể làm tốt hơn đáng kể và Okasaki mô tả nhiều kỹ thuật hữu ích, từ kỹ thuật khấu hao đến thực tế thời gian thực hiện công việc khấu hao tăng dần. Các cấu trúc dữ liệu chức năng thuần túy có thể hơi khó khăn để làm việc và phân tích, nhưng chúng cung cấp nhiều lợi ích như tính minh bạch tham chiếu hữu ích trong tối ưu hóa trình biên dịch, song song và tính toán phân tán và thực hiện các tính năng như phiên bản, hoàn tác và khôi phục.
Cũng lưu ý rằng tất cả những điều này chỉ thảo luận về thời gian chạy không có triệu chứng. Nhiều kỹ thuật để thực hiện các cấu trúc dữ liệu chức năng thuần túy cung cấp cho bạn một số yếu tố chậm liên tục nhất định, do cần có thêm sổ sách kế toán để chúng hoạt động và chi tiết triển khai ngôn ngữ được đề cập. Lợi ích của các cấu trúc dữ liệu chức năng thuần túy có thể vượt xa các yếu tố chậm chạp liên tục này, do đó, bạn thường sẽ cần phải đánh đổi dựa trên vấn đề đang bàn đến.
Người giới thiệu
- Ben-Amram, Amir và Galil, Zvi 1992. Tạp chí "Về con trỏ so với địa chỉ" Tạp chí ACM, 39 (3), trang 617-648, tháng 7 năm 1992
- Ben-Amram, Amir 1996. "Ghi chú về So sánh giữa Lisp thuần khiết và không tinh khiết" của Pippenger , bản thảo chưa được công bố, DIKU, Đại học Copenhagen, Đan Mạch
- Bird, Richard, Jones, Geraint, và De Moor, Oege 1997. " Nhanh chóng hơn, ít tốc độ hơn: đánh giá lười biếng so với háo hức" Tạp chí Lập trình chức năng 7, 5 trang 541 Chuyện547, tháng 9 năm 1997
- Okasaki, Chris 1996. Luận án tiến sĩ "thuần túy chức năng" , Đại học Carnegie Mellon
- Okasaki, Chris 1998. "Cấu trúc dữ liệu chức năng thuần túy" Nhà xuất bản Đại học Cambridge, Cambridge, Vương quốc Anh
- Pippenger, Nicholas 1996. Hội thảo chuyên đề ACM "Pure Versus Impure Lisp" về các nguyên tắc của ngôn ngữ lập trình, trang 104 Phản 109, tháng 1 năm 1996