Ở mức độ nào một thuật toán có thể dự đoán độ phức tạp thời gian của một chương trình đầu vào tùy ý?


23

Các vấn đề ngăn chặn khẳng định rằng nó là không thể để viết một chương trình mà có thể xác định nếu một tạm dừng chương trình, cho tất cả các chương trình đầu vào càng tốt .

Tuy nhiên, tôi chắc chắn có thể viết một chương trình có thể tính thời gian chạy của một chương trình như:

for(i=0; i<N; i++)
    { x = 1; }

và trả về độ phức tạp thời gian của , mà không bao giờ chạy nó.N

Đối với tất cả các chương trình đầu vào khác, nó sẽ trả về một cờ cho biết nó không thể xác định độ phức tạp thời gian.

Câu hỏi của tôi là:

Những điều kiện phải giữ, sao cho chúng ta có thể xác định một cách thuật toán độ phức tạp thời gian của một chương trình nhất định?

* Nếu có một tài liệu tham khảo chính thức hoặc bài viết đánh giá về điều này, tôi sẽ đánh giá cao một liên kết đến nó trong các ý kiến.


1
(1. (3) Quyết định xem một chương trình nhất định có dừng lại hay không và đưa ra giới hạn trên rõ ràng về độ phức tạp thời gian của chương trình là khác nhau.
Tsuyoshi Ito

1
Tôi không quen với việc suy ra độ phức tạp thời gian của các chương trình trong các lớp bị hạn chế, nhưng một lớp chương trình có thể đáng để kiểm tra được gọi là các chương trình vòng lặp giới hạn, có thể dễ dàng ràng buộc độ phức tạp thời gian. Tôi nhớ rằng các chương trình vòng lặp giới hạn được thảo luận trong Chương 3 của Gems of Science Science Computerory của Uwe Schöning và Randall J. Pruim trong bối cảnh quyết định sự tương đương của hai chương trình, nhưng tôi không chắc chương này có liên quan đến câu hỏi của bạn đến mức nào.
Tsuyoshi Ito

4
Tôi có chút bối rối. Điều này nằm ngoài phạm vi nào? Một câu trả lời hợp lý cho câu hỏi của OP sẽ là các đoạn ngôn ngữ (hoặc thậm chí các lớp của các đoạn) mà thời gian chạy có thể được xác định theo thuật toán.
Suresh Venkat


7
Tôi cực kỳ muộn với chủ đề bình luận này. Chúng tôi dường như chộp lấy khoảnh khắc một bài đăng có mùi newbie-ish. Tôi không chỉ tay. Tôi cảm thấy bản năng này. Có lẽ chúng ta nên dịu dàng hơn. OP thừa nhận không quen thuộc với khu vực hoặc điều khoản. Điểm của một trang web trả lời câu hỏi là gì nếu chúng ta chỉ chấp nhận những người biết chính xác những gì họ muốn và hỏi nó bằng ngôn ngữ của chúng tôi.
Vijay D

Câu trả lời:


23

Nói chung, bạn không thể xác định độ phức tạp, ngay cả đối với các chương trình tạm dừng: hãy để là một số máy Turing tùy ý và đặt p T là chương trình (luôn trả về 0):TpT

input: n
run T for n steps
if T is in halting state, output: 0
otherwise, loop for n^2 steps and output: 0

Rõ ràng là nói chung là không thể giải quyết được cho dù là thời gian tuyến tính hay thời gian bậc hai.pT

Tuy nhiên, nhiều công việc đã được thực hiện trên tính toán hiệu quả của độ phức tạp của chương trình. Tôi đặc biệt thích Lý thuyết phức tạp tiềm ẩn nhằm tạo ra các ngôn ngữ, sử dụng các cấu trúc đặc biệt hoặc các loại kỷ luật, cho phép người ta chỉ viết các chương trình nằm trong một lớp phức tạp được xác định rõ. Theo những gì tôi coi là một điều kỳ diệu, những ngôn ngữ này thường được hoàn thành cho lớp học đó!

Một ví dụ đặc biệt hay được mô tả trong bài báo này của J.-Y. Marion, trong đó mô tả một ngôn ngữ mệnh lệnh nhỏ, với một kỷ luật loại lấy cảm hứng từ kỹ thuật luồng thông tin và phân tích an ninh, cho phép một đặc điểm của thuật toán trong P .


Như một lưu ý phụ, cũng xem Epigram, một ngôn ngữ có thể đảm bảo chấm dứt.
Realz Slaw

Đây là một khởi đầu tốt đẹp, nhưng có nhiều điều để nói? (Ví dụ, đối với tôi, thời gian chạy của hàm đệ quy cơ bản nhất định phải đơn giản để tính toán, nhưng các hàm như vậy có thể giải quyết bất kỳ vấn đề nào trong hệ thống phân cấp theo cấp số nhân ....)
usul

Trong chừng mực có thể xác định rằng chương trình đầu vào được viết bằng ngôn ngữ bị hạn chế, bạn có thể giả sử độ phức tạp thời gian bị ràng buộc bởi bất kỳ giới hạn trên nào mà ngôn ngữ áp đặt. Tuy nhiên, nhiều hàm đệ quy nguyên thủy có tương đương đệ quy chung hiệu quả hơn
Chris Pressey

1
(vô tình lưu bình luận đó sớm, sau đó vượt quá giới hạn 5 phút. Câu thứ hai nên đọc như sau :) Tuy nhiên, các chương trình trong các ngôn ngữ bị hạn chế này có thể có tương đương trong các ngôn ngữ ít bị hạn chế hơn, hiệu quả hơn (cụ thể, nhiều hàm đệ quy nguyên thủy có tương đương đệ quy chung hiệu quả hơn), trong thực tế, khuyến khích việc sử dụng các ngôn ngữ không bị hạn chế, khó phân tích hơn.
Chris Pressey

Điều đó rất thú vị Chris! Bạn đã có một tài liệu tham khảo? Trong thực tế, nó có vẻ phản tác dụng: Tôi đã nghi ngờ các hàm đệ quy nguyên thủy có thể mô phỏng các hàm đệ quy chung cho một số bước nhất định, sau đó sẽ giới hạn tốc độ đến một số yếu tố không đổi.
cody

11

Câu hỏi bạn đặt ra và thủ thuật đếm cụ thể mà bạn mô tả là một câu hỏi kinh điển trong phân tích chương trình. Có một vấn đề lý thuyết về phân tích độ phức tạp và đó là biểu hiện thực tế về mặt tự động ước tính hiệu suất của một đoạn mã. Một phân tích tự động như vậy có một số ứng dụng từ việc phát hiện các lỗi hiệu suất đến ước tính chi phí cho một số tính toán trong đám mây.

Cody chỉ ra rằng vấn đề là không thể giải quyết được nói chung. Vấn đề này khó hơn so với việc chứng minh chấm dứt, bởi vì có được sự phức tạp ràng buộc đòi hỏi mà chương trình cũng chấm dứt. Có hai cách tiếp cận vấn đề như vậy. Một là từ phân tích chương trình. Ý tưởng về việc thêm một bộ đếm và ước tính giá trị của nó tồn tại từ những năm 70. Mã hóa này làm giảm vấn đề xác định thời gian chạy với tính toán bất biến.

Cách tiếp cận thứ hai là thiết kế một ngôn ngữ lập trình chỉ chấp nhận các chương trình có độ phức tạp giới hạn nhất định. Đây là khu vực phức tạp tính toán ngầm.

Một số tài liệu tham khảo cho cả hai lĩnh vực sau.

  1. Dự án TỐC ĐỘ , là một dòng công việc phân tích chương trình cụ thể tập trung vào cách tìm giới hạn trên các quầy đã được đưa vào chương trình. Các quầy có thể đo thời gian hoặc không gian tiêu thụ.
  2. Phân tích tài nguyên khấu hao đa biến , Jan Hoffman, Klaus Aehlig, Martin Hoffman, ACM TOPLAS 2012
  3. Về các thuộc tính tốc độ tăng trưởng có thể quyết định của các chương trình bắt buộc , Amir Ben Amram, Sự phát triển trong tính toán ngầm tính CompExity 2010. Đây là một công việc tuyệt vời về sự phức tạp của các chương trình bắt buộc bởi các hạn chế cú pháp.
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.