Jak zmaksymalizować


9

Widzę wiele problemów algorytmicznych, które zawsze sprowadzają się do czegoś o długości:

Masz tablicę liczb całkowitychh[1..n]0, musisz znaleźć i,j takie, które maksymalizuje (h[j]h[i])(ji) w O(n) czas.

Oczywiście O(n2) rozwiązaniem czasowym jest rozważenie wszystkich par, jednak czy jest jakiś sposób, aby zmaksymalizować wyrażenie O(n) nie wiedząc nic więcej o właściwościach h?

Jednym z pomysłów, o których myślałem, jest naprawienie j, to musimy znaleźć i od 1 do j1 to jest równe argmaxi{(h[j]h[i])(ji)} lub argmaxi{h[j]jh[j]ih[i]j+h[i]i} i odtąd j jest naprawiony, wtedy potrzebujemy argmaxi{h[j]ijh[i]+ih[i]}.

Nie widzę jednak sposobu, aby się go pozbyć jwarunki zależne w środku. Jakaś pomoc?


Will an O(nlogn)rozwiązanie może być pomocne?
xskxzr

@xskxzr na pewno jeśli masz jakieś
AspiringMat

Odpowiedzi:


5

To jest O(nlogn)rozwiązanie. NaO(n)rozwiązanie wskazane przez Willarda Zhana jest dołączone na końcu tej odpowiedzi.


O(nlogn) rozwiązanie

Oznacz dla wygody f(i,j)=(h[j]h[i])(ji).

Definiować l1=1, i li być najmniejszym indeksem takim, że li>li1 i h[li]<h[li1]. Podobnie zdefiniujr1=n, i ri być największym indeksem takim, że ri<ri1 i h[ri]>h[ri1]. Sekwencjel1,l2,... i r1,r2, są łatwe do obliczenia O(n) czas.

Przypadek, w którym nie ma i<j takie, że h[i]<h[j] (to znaczy f(i,j)>0) jest banalna. Skupiamy się teraz na sprawach niebanalnych. W takich przypadkach, aby znaleźć rozwiązanie, musimy wziąć pod uwagę tylko takie pary.

Dla każdego i<j takie, że h[i]<h[j], pozwolić u być największym indeksem takim, że lui, i v być najmniejszym indeksem takim, że rvj, następnie h[lu]h[i] (Inaczej lu+1i z definicji lu+1, jest zatem sprzeczne z definicją u) i podobnie h[rv]h[j]. W związku z tym

(h[rv]h[lu])(rvlu)(h[j]h[i])(rvlu)(h[j]h[i])(ji).
Oznacza to, że musimy brać pod uwagę tylko pary (lu,rv) gdzie lu<rv.

Oznaczać v(u)=argmaxv: lu<rvf(lu,rv)mamy następujący lemat.

Para gdzie i gdzie istnieje tak że i lub takie, że i , nie może być ostatecznym optymalnym rozwiązaniem.(lu,rv)lu<rvu0u<u0v<v(u0)u>u0v>v(u0)

Dowód. Zgodnie z definicjąmamy lub 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.

W przypadku, gdy i , zanotuj i , a także i mamy 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)).

Oznacza to lub

(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).

Tak więc jest zdecydowanie lepszym rozwiązaniem niż . Dowód dla drugiego przypadku jest podobny. (lu,rv(u0))(lu,rv)

Możemy najpierw obliczyć gdzie jest długością sekwencji , a następnie rekurencyjnie obliczyć optymalne rozwiązanie spośród dla i i optymalne rozwiązanie spośród dla i . Ze względu na lemat globalne optymalne rozwiązanie musi pochodzić z .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) Rozwiązanie

Niech jeśli . Dowód lematu pokazuje również ważną właściwość: dla i , jeśli , to . Oznacza to, że macierz to macierz całkowicie monotoniczna, gdzie jest długością sekwencji (więc oznacza -ty element od końca), następnie algorytm SMAWK może zastosować, aby znaleźć minimalną wartość , a więc maksymalną wartość .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
Udowodniono, że jest macierzą monotoniczną, więc dziel i rządź daje algorytm . Ale możesz faktycznie udowodnić, że to Monge , dzięki czemu można zastosować algorytm SMAWK . f(lu,rv)O(nlogn)f(lu,rv)O(n)
Willard Zhan,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.