Làm thế nào phức tạp thuật toán được mô hình hóa cho các ngôn ngữ chức năng?


38

Độ phức tạp của thuật toán được thiết kế để độc lập với các chi tiết cấp thấp hơn nhưng nó dựa trên một mô hình bắt buộc, ví dụ truy cập mảng và sửa đổi một nút trong cây mất thời gian O (1). Đây không phải là trường hợp trong các ngôn ngữ chức năng thuần túy. Danh sách Haskell mất thời gian tuyến tính để truy cập. Sửa đổi một nút trong cây liên quan đến việc tạo một bản sao mới của cây.

Sau đó nên có một mô hình thay thế phức tạp thuật toán cho các ngôn ngữ chức năng?


3
Đây có thể là những gì bạn đang tìm kiếm.
Aristu

1
Câu hỏi của bạn có thể được trả lời ở đây: cs.stackexchange.com/q/18262/755 . Cụ thể, độ phức tạp thời gian trong ngôn ngữ hàm thuần túy khác với độ phức tạp thời gian trong ngôn ngữ bắt buộc bởi nhiều nhất là tỷ lệ , đối với một số giả định phù hợp về khả năng của cả hai ngôn ngữ. O(logn)
DW

3
GHC Haskell hỗ trợ các mảng và cây có thể thay đổi và không có gì, cho phép bạn thực hiện truy cập mảng và sửa đổi các nút cây trong thời gian O (1), sử dụng "các luồng trạng thái" (các đơn nguyên ST).
Tanner Swett

1
@BobJarvis Phụ thuộc. Là một danh sách một kiểu dữ liệu trừu tượng cho bạn, hoặc bạn đang xem xét cụ thể các danh sách được liên kết?
Raphael

1
Mục đích nào bạn tìm kiếm cho mô hình phức tạp thuật toán? Bạn đang tìm kiếm một cái gì đó thuần túy về mặt toán học, hoặc một cái gì đó thực tế? Đối với một giá trị thực tế, cần chú ý đến những thứ như bạn có khả năng ghi nhớ hay không, nhưng theo quan điểm thuần túy toán học, khả năng thực hiện không thành vấn đề.
Cort Ammon

Câu trả lời:


34

Nếu bạn cho rằng -calculus là một mô hình tốt về ngôn ngữ lập trình chức năng, thì người ta có thể nghĩ: -calculus có một khái niệm đơn giản về độ phức tạp thời gian: chỉ cần đếm số bước -redtion .λ β ( λ x . M ) N M [ N / x ]λλβ(λx.M)NM[N/x]

Nhưng đây có phải là một biện pháp phức tạp tốt?

Để trả lời câu hỏi này, chúng ta nên làm rõ những gì chúng ta có nghĩa là bằng cách đo độ phức tạp ở nơi đầu tiên. Một câu trả lời hay được đưa ra bởi luận điểm của Slot và van Emde Boas : bất kỳ thước đo độ phức tạp tốt nào cũng phải có mối quan hệ đa thức với khái niệm chính tắc về độ phức tạp thời gian được xác định bằng máy Turing. Nói cách khác, cần có một mã hóa 'hợp lý' Từ thuật ngữ -calculus cho các máy Turing, chẳng hạn như đối với một số đa thức , đó là trường hợp cho mỗi thuật ngữ có kích thước: giảm xuống một giá trị trong các bước khử chính xác khi giảm xuống một giá trị trongλ p M | M | M p ( | M | ) β t r ( M ) p ( | t r ( M ) | )tr(.)λpM|M|Mp(|M|) βtr(M)p(|tr(M)|) của máy Turing.

Trong một thời gian dài, không rõ liệu điều này có thể đạt được trong phép tính. Không. Các vấn đề chính là như sau.

  • Có các thuật ngữ tạo ra các hình thức bình thường (trong một số bước đa thức) có kích thước theo cấp số nhân. Ngay cả việc viết ra các hình thức bình thường cũng mất thời gian theo cấp số nhân.
  • Chiến lược giảm được lựa chọn đóng một vai trò quan trọng. Ví dụ, tồn tại một nhóm các thuật ngữ làm giảm số lượng các bước parallel song song (theo nghĩa giảm tối ưu ), nhưng độ phức tạp của nó là không cơ bản (nghĩa là tệ hơn theo cấp số nhân).

Bài báo " Giảm Beta là bất biến, thực sự " của B. Accattoli và U. Dal Lago làm rõ vấn đề bằng cách hiển thị một mã hóa 'hợp lý' bảo tồn lớp P phức tạp của các hàm thời gian đa thức, giả sử việc giảm tên gọi ngoài cùng bên trái . Cái nhìn sâu sắc quan trọng là sự nổ tung theo cấp số nhân chỉ có thể xảy ra vì những lý do 'không thú vị' có thể bị đánh bại bằng cách chia sẻ thích hợp. Nói cách khác, lớp P giống nhau cho dù bạn xác định nó đếm các bước của máy Turing hay (ngoài cùng ngoài cùng bên ngoài) -reductions.β

Tôi không chắc tình huống nào cho các chiến lược đánh giá khác. Tôi không biết rằng một chương trình tương tự đã được thực hiện vì sự phức tạp của không gian.


23

Độ phức tạp thuật toán được thiết kế để độc lập với các chi tiết cấp thấp hơn.

Không thật sự lắm. Chúng tôi luôn tính các thao tác cơ bản trong một số kiểu máy:

  • Các bước cho máy Turing.
  • Các thao tác cơ bản trên RAM.

Có lẽ bạn đã nghĩ về toàn bộ / / -business. Mặc dù đúng là bạn có thể trừu tượng hóa một số chi tiết triển khai với Landau tiệm cận, bạn không thoát khỏi tác động của mô hình máy. Các thuật toán có thời gian chạy rất khác nhau, giả sử TM và RAM - ngay cả khi bạn chỉ xem xét các lớp !Θ O ΘΩΘOΘ

Do đó, câu hỏi của bạn có một câu trả lời đơn giản: sửa một kiểu máy và "thao tác" nào cần tính. Điều này sẽ cung cấp cho bạn một biện pháp. Nếu bạn muốn kết quả có thể so sánh với các thuật toán phi chức năng, bạn sẽ được phục vụ tốt nhất để biên dịch các chương trình của mình thành RAM (để phân tích thuật toán) hoặc TM (cho lý thuyết phức tạp) và phân tích kết quả. Định lý chuyển giao có thể tồn tại để giảm bớt quá trình này.


Đã đồng ý. Mặt lưu ý: Người ta thường xuyên kiếm được nhiều sai lầm về những gì hoạt động là "liên tục". Ví dụ: giả sử a + b là O(1)khi nó thực sựO(log ab)
Paul Draper

3
@PaulDraper Đó là một giả định khác, không nhất thiết là một sai lầm. Chúng ta có thể mô hình hóa những gì chúng ta muốn - câu hỏi là nếu nó trả lời các câu hỏi thú vị. Xem thêm tại đây .
Raphael

nghe có vẻ rất tệ như "thoát khỏi mô hình máy móc"
Paul Draper

@PaulDraper Phụ thuộc vào loại tình cảm mà bạn gắn với từ "máy". Xem thêm cuộc thảo luận này . FWIW, mô hình RAM chi phí đơn vị - được cho là mô hình chuẩn trong phân tích thuật toán! - hữu ích, nếu không nó sẽ không được sử dụng trong nhiều thập kỷ nay. Tất cả các giới hạn quen thuộc để sắp xếp, tìm kiếm tress, vv đều dựa trên mô hình đó. Nó có ý nghĩa bởi vì nó mô hình các máy tính thực sự miễn là số lượng phù hợp với các thanh ghi.
Raphael

1

Thay vì xây dựng thước đo độ phức tạp của bạn theo một số máy trừu tượng cơ bản, bạn có thể nướng chi phí vào chính các định nghĩa ngôn ngữ - đây được gọi là Động lực học chi phí . Người ta gắn chi phí cho mọi quy tắc đánh giá bằng ngôn ngữ, theo cách cấu thành - nghĩa là chi phí của một hoạt động là một hàm của chi phí cho các biểu thức con của nó. Cách tiếp cận này là tự nhiên nhất đối với các ngôn ngữ chức năng, nhưng nó có thể được sử dụng cho bất kỳ ngôn ngữ lập trình được xác định rõ nào (tất nhiên, hầu hết các ngôn ngữ lập trình không may không được xác định rõ).


<Thảo luận về mô hình máy đã bị xóa.> Chúng ta hãy tiếp tục cuộc thảo luận này trong trò chuyện .
Raphael
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.