Thuật toán thời gian tuyến tính để tìm tối đa thay đổi


11

Giả sử rằng chúng ta được cung cấp một mảng A[1..n] có chứa các số nguyên không âm (không nhất thiết phải khác biệt).

Đặt B được Asắp xếp theo thứ tự không tăng. Chúng tôi muốn tính

m=maxi[n]B[i]+i.

Giải pháp rõ ràng là sắp xếp A và sau đó tính m . Điều này đưa ra một thuật toán chạy trong thời gian O(nlgn) trong trường hợp xấu nhất.

Có thể làm tốt hơn? Chúng ta có thể tính m trong thời gian tuyến tính không?


Câu hỏi chính của tôi là một ở trên. Nhưng sẽ rất thú vị khi biết về khái quát hóa vấn đề sau đây.

Đặt BA được Asắp xếp theo một số phép so sánh f một hàm được đưa ra bởi một lời tiên tri. Cho A và các phép lạ cho f , chúng ta có thể nói gì về thời gian cần thiết để tính m=maxi[n]f(B[i],i) ?

Chúng ta vẫn có thể tính m trong thời gian O(nlgn) . Nhưng chúng ta có thể chứng minh một siêu tuyến tính giới hạn thấp hơn cho trường hợp tổng quát này không?

Nếu câu trả lời là có thì giữ giới hạn dưới nếu chúng ta giả sử rằng là thứ tự thông thường trên các số nguyên và là một hàm "đẹp" (đơn điệu, đa thức, tuyến tính, v.v.)?f

Câu trả lời:


10

Chúng ta có thể tính trong thời gian tuyến tính.m

Để đơn giản, giả sử rằng các mảng là 0 dựa: , . Chúng tôi muốn tính .A[0..n1]B[0..n1]m=maxiB[i]+i

Đặt . Rõ ràng là .max=maxiA[i]maxm

Đặt là sau khi sắp xếp. Nếu ta có A[j]B[k]A[j]maxn

B[k]+kB[k]+(n1)=A[j]+(n1)(maxn)+(n1)=max1<maxm.

Do đó, chúng ta có thể bỏ qua khi . Chúng ta chỉ cần xem xét các số trong phạm vi .A[j]A[j]maxn[maxn,max]

Chúng ta có thể sử dụng sắp xếp đếm để sắp xếp các số trong nằm trong phạm vi trong thời gian tuyến tính và sử dụng danh sách được sắp xếp để tính .A[maxn,max]m


... Mmm ... nhưng chi phí của C [x] = C [x] +1 là gì?!?
Marzio De Biasi

1
Có vấn đề với câu trả lời của bạn? bởi vì nó có vẻ tốt đối với tôi: bạn đang nói rằng chúng tôi chỉ quan tâm đến các phần tử mảng với các giá trị trong , vì vậy chúng tôi có thể sử dụng sắp xếp đếm. Điều này hoạt động cho vấn đề chung bất cứ khi nào cho tất cả . [Mn,M]|f(B[i],i)B[i]|=O(n)i
Sasho Nikolov

Cảm ơn @Marzio. :) Tôi hơi chỉnh sửa câu trả lời của bạn cho rõ ràng. Vui lòng quay lại chỉnh sửa của tôi hoặc chỉnh sửa thêm.
Kaveh

1
Giải pháp này dường như cũng hoạt động với mọi trong đó cho tất cả và , . f(x,i)xin|f(x,i)x|=O(n)
Kaveh

@Kaveh: chỉnh sửa là ok! Tôi đã viết câu trả lời nhanh chóng và tôi thậm chí không chắc về tính chính xác của nó: -S
Marzio De Biasi

-1

Nếu mảng bao gồm các số nguyên riêng biệt, thì , vì khoảng cách giữa các mục liền kề trong ít nhất là ; tình hình thú vị hơn khi chúng không cần phải khác biệt.Am=max(A)+1B1

Đối với câu hỏi chung hơn của bạn, hãy tưởng tượng một tình huống trong đó chỉ "thú vị" khi . Dường như có thể xây dựng một đối số nghịch cảnh buộc bạn phải truy vấn cho tất cả trước khi bạn có thể biết , do đó bạn cần sắp xếp để tìm câu trả lời, trong đó có so sánh . (Có một số biến chứng vì có thể là trường hợp chúng ta có thể kiểm tra xem không đổi thay vì thời gian tuyến tính bằng cách truy vấn .) Đây là trường hợp ngay cả khi là một đa thức (mức độ cao).f(B[i],j)i=jf(B[i],i)imaxif(B[i],i)AΩ(nlogn)A[i]=B[j]f(A[i],j)f


1
Nếu A có n - 1 số không và một số không thì sao? Sau đó, câu trả lời là n, không phải 1.
Grigory Yaroslavtsev

Xin chào Yuval. Có thể được lặp lại con số trong . Như Grigory cho biết giải pháp dường như không hiệu quả. A
Kaveh

Tôi nghĩ rằng tôi thấy ý tưởng của bạn cho đối số giới hạn dưới: đã cho chúng ta có thể tính toán nhanh chóng bằng cách sử dụng các cặp truy vấn được thực hiện cho bằng thuật toán giải quyết vấn đề trong thời gian . Chúng tôi có thể đảm bảo các truy vấn thuật toán trên tất cả nhưng chúng tôi không thể đảm bảo rằng nó không truy vấn các cặp khác. Tuy nhiên, chúng ta có thể đặt cho các cặp khác thành một giá trị có thể phân biệt để chúng ta có thể loại bỏ các cặp đó. ABfo(nlgn)f(B[i],i)f
Kaveh
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.