Widzę wiele problemów algorytmicznych, które zawsze sprowadzają się do czegoś o długości:
Masz tablicę liczb całkowitych, musisz znaleźć takie, które maksymalizuje w czas.
Oczywiście rozwiązaniem czasowym jest rozważenie wszystkich par, jednak czy jest jakiś sposób, aby zmaksymalizować wyrażenie nie wiedząc nic więcej o właściwościach ?
Jednym z pomysłów, o których myślałem, jest naprawienie , to musimy znaleźć od do to jest równe lub i odtąd jest naprawiony, wtedy potrzebujemy .
Nie widzę jednak sposobu, aby się go pozbyć warunki zależne w środku. Jakaś pomoc?
algorithms
algorithm-analysis
optimization
AspiringMat
źródło
źródło
Odpowiedzi:
To jestO(nlogn) rozwiązanie. NaO(n) rozwiązanie wskazane przez Willarda Zhana jest dołączone na końcu tej odpowiedzi.
Oznacz dla wygodyf(i,j)=(h[j]−h[i])(j−i) .
Definiowaćl1=1 , i li być najmniejszym indeksem takim, że li>li−1 i h[li]<h[li−1] . Podobnie zdefiniujr1=n , i ri być największym indeksem takim, że ri<ri−1 i h[ri]>h[ri−1] . Sekwencjel1,l2,... i r1,r2,… są łatwe do obliczenia O(n) czas.
Przypadek, w którym nie mai<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żdegoi<j takie, że h[i]<h[j] , pozwolić u być największym indeksem takim, że lu≤i , i v być najmniejszym indeksem takim, że rv≥j , następnie h[lu]≤h[i] (Inaczej lu+1≤i z definicji lu+1 , jest zatem sprzeczne z definicją u ) i podobnie h[rv]≥h[j] . W związku z tym
Oznaczaćv(u)=argmaxv: lu<rvf(lu,rv) mamy następujący lemat.
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,…,ℓ/2−1 v=v(ℓ/2),v(ℓ/2)+1,… o2 (lu,rv) u=ℓ/2+1,ℓ/2+2,… v=1,…,v(ℓ/2) {(lℓ/2,rv(ℓ/2)),o1,o2}
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)=−∞ lu≥rv u>u0 v>v0 f(lu0,rv0)≥f(lu0,rv) f(lu,rv0)>f(lu,rv) M[x,y]:=−f(lx,rc−y+1) c r1,r2,… rc−y+1 y M f
źródło