Tôi muốn chứng minh hoặc bác bỏ sự tồn tại của một thuật toán, với một mảng gồm các số nguyên, tìm thấy ba chỉ số i , j và k sao cho i < j < k và A [ i ] < A [ j ] < A [ k ] (hoặc thấy rằng không có bộ ba như vậy) trong thời gian tuyến tính.
Đây không phải là một câu hỏi bài tập về nhà; Tôi thấy nó trên một diễn đàn lập trình được đóng khung khi cố gắng thực hiện một thuật toán như vậy. Tôi nghi ngờ rằng điều đó là không thể sau nhiều thử nghiệm khác nhau. Trực giác của tôi nói với tôi như vậy, nhưng điều đó không thực sự được tính cho bất cứ điều gì.
Tôi muốn chứng minh nó chính thức. Bạn làm nó như thế nào? Tôi lý tưởng muốn thấy một bằng chứng được đưa ra từng bước, và sau đó nếu bạn rất có khuynh hướng, một số giải thích về cách đi về việc chứng minh / từ chối các câu hỏi đơn giản như thế này nói chung. Nếu nó giúp, một số ví dụ:
[1,5,2,0,3] → (1,2,3)
[5,6,1,2,3] → (1,2,3)
[1,5,2,3] → (1,2,3)
[5,6,1,2,7] → (1,2,7)
[5,6,1,2,7,8] → (1,2,7)
[1,2,999,3] → (1,2,999)
[999,1,2,3] → (1,2,3)
[11,12,8,9,5,6,3,4,1,2,3] → (1,2,3)
[1,5,2,0,-5,-2,-1] → (-5,-2,-1)
Tôi nghĩ rằng người ta có thể lặp lại , và mỗi lần có một i < j ( j hiện tại của chúng tôi ), chúng tôi tạo ra một bộ ba mới và đẩy nó vào một mảng. Chúng tôi tiếp tục bước và so sánh từng bộ ba cho đến khi một trong ba bộ của chúng tôi hoàn thành. Vì vậy, nó như thế , ! Nhưng tôi nghĩ rằng điều này phức tạp hơn chỉ là O ( n ) vì số lượng bộ ba trên mảng ba của chúng tôi trong trường hợp xấu nhất tương ứng với kích thước của danh sách đầu vào.[1,5,2,0,-5,-2,-1] → 1..2.. -5.. -2.. -1
[1,5,2,0,-5,-2,3,-1] → 1..2.. -5.. -2.. 3