Ví dụ về các thuật toán và bằng chứng có vẻ đúng, nhưng không


15

Trong phần giới thiệu của tôi về khóa học lập trình, chúng tôi đang tìm hiểu về phương pháp Khởi tạo-Bảo trì-Chấm dứt để chứng minh một thuật toán thực hiện những gì chúng tôi mong đợi. Nhưng chúng tôi chỉ phải chứng minh rằng một thuật toán đã được biết là chính xác, là chính xác. Chúng tôi chưa bao giờ được yêu cầu chỉ ra rằng một thuật toán không chính xác.

Có bất kỳ ví dụ cổ điển nào về thuật toán có vẻ chính xác, nhưng không? Tôi đang tìm kiếm các trường hợp trong đó phương pháp Khởi tạo-Bảo trì-Chấm dứt bắt được thứ gì đó mà trực giác nhìn thoáng qua không có.


5
Có thể quan tâm: cs.stackexchange.com/q/29475/755
DW

5
Nâng cao vì tôi nghĩ rằng đây là một câu hỏi sư phạm rất quan trọng. Nó hơi ngoài phạm vi của cstheory, nhưng tôi không biết một nền tảng tốt hơn cho nó, và có nhiều người hướng dẫn thuật toán trong cộng đồng cstheory. Hầu hết các khóa học thiết kế thuật toán chỉ cho sinh viên sửa các thuật toán hiện có và các vấn đề có thể giải quyết dễ dàng bằng các kỹ thuật đã biết. Điều này củng cố ấn tượng, rất hấp dẫn đối với sinh viên, rằng người ta có thể tin tưởng một cách an toàn vào cảm giác trực quan của một người rằng một thuật toán có vẻ hợp lý là đúng. Một khóa học thiết kế thuật toán tốt nên làm ngược lại!
Neal Young

3
Tôi rất thích có một bộ sưu tập như thế này.
Chandra Chekuri

Câu trả lời:


20

2D tối đa cục bộ

đầu vào: 2 chiều mảng An×nA

đầu ra: tối đa cục bộ - một cặp sao cho A [ i , j ] không có ô lân cận trong mảng chứa giá trị lớn hơn hoàn toàn. (i,j)A[i,j]

(Các ô lân cận là các ô trong số có trong mảng.) Vì vậy, ví dụ, nếu AA[i,j+1],A[i,j1],A[i1,j],A[i+1,j]A

0134323125014013

sau đó mỗi ô được in đậm là một cực đại cục bộ. Mỗi mảng không trống có ít nhất một tối đa cục bộ.

Thuật toán. Có một thuật toán thời gian : chỉ cần kiểm tra từng ô. Đây là một ý tưởng cho một thuật toán đệ quy nhanh hơn.O(n2)

AXXA(i,j)X(i,j)(i,j)

AXAX(i,j)A

AA

(i,j)AA(i,j)

n2×n2A(i,j)

T(n)n×nT(n)=T(n/2)+O(n)T(n)=O(n)

Do đó, chúng tôi đã chứng minh định lý sau:

O(n)n×n

Hay là chúng ta?


Lúc mới đọc, lỗi duy nhất tôi phát hiện ra là giải pháp tái phát. Đó có phải là sai lầm duy nhất?
Radu GRIGore

1
Việc tái phát là chính xác. Thuật toán là không!
Neal Young

1
Ah, vâng, tôi đã phạm một sai lầm ngớ ngẩn với sự tái phát. Tôi thấy vấn đề: tối đa bạn chứng minh tồn tại không (nhất thiết) những gì bạn tìm thấy. Và những gì bạn tìm thấy bỏ qua X.
Radu GRIGore

3
(2143300101230001023002222222333233300323000032300)

2
AA
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.