Cách tối đa hóa


9

Tôi thấy nhiều vấn đề thuật toán luôn giảm xuống một số thứ dài:

Bạn có một mảng số nguyên , bạn cần tìm sao cho tối đa hóa trong thời gian .h[1..n]0i,j(h[j]h[i])(ji)O(n)

Rõ ràng giải pháp thời gian là xem xét tất cả các cặp, tuy nhiên, có cách nào chúng ta có thể tối đa hóa biểu thức trong mà không cần biết gì khác về tính chất của không?O(n2)O(n)h

Một ý tưởng tôi nghĩ đến là sửa , sau đó chúng ta cần tìm từ đến bằng với hoặc và kể từji1j1argmaxi{(h[j]h[i])(ji)}argmaxi{h[j]jh[j]ih[i]j+h[i]i}j được sửa, nên chúng tôi cầnargmaxi{h[j]ijh[i]+ih[i]} .

Tuy nhiên, tôi thấy không có cách nào để thoát khỏi các điều khoản phụ thuộc j bên trong. Có ai giúp đỡ không?


Sẽ một O(nlogn) giải pháp hữu ích?
xskxzr

@xskxzr chắc chắn nếu bạn có bất kỳ
AspiresMat

Câu trả lời:


5

Đây là một giải pháp . Một giải pháp O ( n ) được chỉ ra bởi Willard Zhan được thêm vào cuối câu trả lời này.O(nlogn)O(n)


Giải pháp O ( n log n )O(nlogn)

Đối với sự kiên nhẫn, biểu thị .f(i,j)=(h[j]h[i])(ji)

Xác định l i là chỉ số nhỏ nhất sao cho l i > l i - 1h [ l i ] < h [ l i - 1 ] . Tương tự, xác định r 1 = nr i là chỉ số lớn nhất sao cho r i < r i - 1h [ r i ] >l1=1lili>li1h[li]<h[li1]r1=nriri<ri1 . Các trình tự l 1 , l 2 , . . . r 1 , r 2 , ... rất dễ tính toán trong O ( n ) thời gian.h[ri]>h[ri1]l1,l2,...r1,r2,O(n)

Trường hợp không có sao cho h [ i ] < h [ j ] (tức là f ( i , j ) > 0 ) là tầm thường. Bây giờ chúng tôi tập trung vào các trường hợp không tầm thường. Trong những trường hợp như vậy, để tìm ra giải pháp, chúng ta chỉ cần xem xét các cặp như vậy.i<jh[i]<h[j]f(i,j)>0

Đối với mỗi h [ i ] < h [ j ] , chúng ta hãy u có chỉ số lớn nhất sao cho l ui , và v là chỉ số nhỏ nhất mà r vj , sau đó h [ l u ] h [ i ] (nếu không l u + 1i theo định nghĩa của l u + 1i<jh[i]<h[j]uluivrvjh[lu]h[i]lu+1ilu+1, Do đó mâu thuẫn với định nghĩa của ), và tương tự h [ r v ] h [ j ] . Do đó ( h [ r v ] - h [ l u ] ) ( r v - l u ) ( h [ j ] - h [ i ] ) ( r v - l u ) ( h [uh[rv]h[j] Điều này có nghĩa là chúng ta chỉ cần xem xét các cặp ( l u , r v ) trong đó l u < r v .

(h[rv]h[lu])(rvlu)(h[j]h[i])(rvlu)(h[j]h[i])(ji).
(lu,rv)lu<rv

Suy ra , chúng ta có bổ đề sau.v(u)=argmaxv: lu<rvf(lu,rv)

(lu,rv)lu<rvu0u<u0v<v(u0)u>u0v>v(u0)

v(u0)

(h[rv(u0)]h[lu0])(rv(u0)lu0)(h[rv]h[lu0])(rvlu0),
(h[rv]h[rv(u0)])lu0+h[lu0](rvrv(u0))+h[rv(u0)]rv(u0)h[rv]rv(u0)0.

u<u0v<v(u0)h[rv]h[rv(u0)]<0rvrv(u0)>0lu<lu0h[lu]>h[lu0]

(h[rv]h[rv(u0)])lu+h[lu](rvrv(u0))> (h[rv]h[rv(u0)])lu0+h[lu0](rvrv(u0)).

(h[rv]h[rv(u0)])lu+h[lu](rvrv(u0))+h[rv(u0)]rv(u0)h[rv]rv(u0)>0,
(h[rv(u0)]h[lu])(rv(u0)lu)>(h[rv]h[lu])(rvlu).

(lu,rv(u0))(lu,rv)

v(/2)l1,l2,o1(lu,rv)u=1,,/21v=v(/2),v(/2)+1,o2(lu,rv)u=/2+1,/2+2,v=1,,v(/2){(l/2,rv(/2)),o1,o2}


O(n)

f(lu,rv)=lurvu>u0v>v0f(lu0,rv0)f(lu0,rv)f(lu,rv0)>f(lu,rv)M[x,y]:=f(lx,rcy+1)cr1,r2,rcy+1yMf


1
f(lu,rv)O(nlogn)f(lu,rv)O(n)
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.