2013-02-24 23 views
6

Với một chương trình P, được viết bằng C++, tôi có thể viết một thuật toán tìm thấy nếu chương trình P thực hiện một thuật toán cụ thể không? Có bất kỳ thuật toán nào giải quyết được vấn đề này không. Vấn đề này có thể giải quyết được không?Có thể viết trình xác minh để kiểm tra xem một chương trình cụ thể có triển khai một thuật toán cụ thể không?

Ví dụ tôi yêu cầu một người thực hiện thuật toán sắp xếp nhanh và bây giờ nếu tôi muốn đảm bảo rằng người đó thực sự đã triển khai thuật toán sắp xếp nhanh. Người đó có thể thực sự thực hiện một số thuật toán phân loại khác và nó sẽ tạo ra đầu ra chính xác và vượt qua tất cả testcases (thử nghiệm hộp đen). Một cách tôi có thể làm điều này là nhìn vào mã nguồn. Tôi muốn tránh nỗ lực thủ công này và muốn viết một chương trình có thể thực hiện công việc này. Câu hỏi đặt ra là "Có thể không?".

+1

Cách để người đó sử dụng giao diện trừu tượng cho một số thao tác cấp thấp, chẳng hạn như truy cập các phần tử và hoán đổi. Sau đó, vượt qua chúng một đối tượng cụ thể mà đảm bảo người gọi gọi những hoạt động đó theo cách mà quicksort sẽ làm. –

Trả lời

5

Từ Rice's Theorem, bạn thậm chí không thể quyết định chung xem một đoạn mã có phải là chức năng sắp xếp hay không bằng cách kiểm tra mã. Bạn có thể, tất nhiên, tìm hiểu xem nó có tác dụng sắp xếp cho một số tập hợp các đầu vào hữu hạn hay không bằng cách chạy nó với các đầu vào đó và kiểm tra kết quả.

Bạn có thể làm điều gì đó cho trường hợp cụ thể của thuật toán sắp xếp đích, bằng cách kiểm tra mảng đang được sắp xếp trong sắp xếp, kiểm tra các bất biến là đặc trưng của thuật toán đích. Ví dụ, mỗi cuộc gọi trong một triển khai sắp xếp nhanh chóng đệ quy sẽ dẫn đến một subarray trở thành sắp xếp.

============================================== ===================

Theo dõi từ nhận xét, tôi đề nghị xem Ahmad Taherkhani's home page. Ông đã tiếp tục nghiên cứu trong lĩnh vực này, bao gồm một bài báo năm 2012 về chủ đề này.

+0

cảm ơn điều đó thực sự hữu ích. Tôi tự hỏi nó sẽ làm việc nếu chúng tôi sử dụng một số thiết lập các chương trình mẫu thực hiện các thuật toán và sau đó chúng tôi cố gắng để phân loại một chương trình. Giống như họ làm trong các vấn đề học máy. – Aryaveer

+0

@Aryaveer Chìa khóa để thực hiện điều đó là tìm các tính năng bạn có thể trích xuất từ ​​văn bản sao cho các điểm gần nhau trong không gian tính năng thể hiện các thuật toán tương tự. Tôi đã thực hiện một số tìm kiếm trên web và tìm thấy [Phân tích chương trình tĩnh để nhận dạng thuật toán sắp xếp] (www.cs.hut.fi/~ahmad/mastersthesis.pdf). Đó là một bài báo năm 2008 nhưng có thể là một điểm khởi đầu hữu ích cho việc tìm kiếm trích dẫn để tìm ra trạng thái của nghệ thuật. –

0

Tôi đã suy nghĩ và vẫn nghĩ về kiểm tra stack/heap (cho bạn thử nghiệm dựa trên các giải pháp được tối ưu hóa).
Bạn có thể kiểm tra độ phức tạp về thời gian và độ phức tạp của bộ nhớ tổng thể sẽ thu hẹp kết quả. ngay cả đối với Time: O (n lg n) để kết hợp và sắp xếp nhanh chóng. bạn có thể phân biệt chúng với việc cấp phát bộ nhớ vì chúng là N, Lg (n) theo thứ tự.
bạn cũng có thể kiểm tra những thứ như nhiễu loạn mảng ban đầu..có nhưng đây không phải là trọng lượng quyết định.

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