Come massimizzare


9

Vedo molti problemi algoritmici che riducono sempre a qualcosa le linee di:

Hai un array intero h[1..n]≥0 , devi trovare i,j tale che massimizzi (h[j]−h[i])(j−i) nel tempo O(n) .

Ovviamente la soluzione temporale O(n2) è quella di considerare tutte le coppie, tuttavia, esiste un modo per massimizzare l'espressione in O(n) senza sapere qualcos'altro sulle proprietà di h ?

Un'idea a cui ho pensato è di correggere j , quindi dobbiamo trovare i∗ da 1 a j−1 che è uguale a argmaxi{(h[j]−h[i])(j−i)} o argmaxi{h[j]j−h[j]i−h[i]j+h[i]i} e poichéj è corretto, allora abbiamo bisogno diargmaxi{−h[j]i−jh[i]+ih[i]} .

Tuttavia, non vedo alcun modo per sbarazzarsi dei termini j dipendenti all'interno. Qualsiasi aiuto?


Una soluzione sarà utile? O(nlog⁡n)
— xskxzr,

@xskxzr sicuro se ne hai
— AspiringMat

Risposte:


5

Questa è una soluzione . Una soluzione O ( n ) indicata da Willard Zhan è allegata all'ultima di questa risposta.O(nlog⁡n)O(n)


soluzioneO(nlog⁡n)

Per comodità, denota .f(i,j)=(h[j]−h[i])(j−i)

Definisco , e l io essere il più piccolo indice tale che l i > l i - 1 e h [ l i ] < h [ l i - 1 ] . Allo stesso modo, definisci r 1 = n , e r i è l'indice più grande tale che r i < r i - 1 e h [ r i ] >l1=1lili>li−1h[li]<h[li−1]r1=nriri<ri−1 . Le sequenze l 1 , l 2 , . . . e r 1 , r 2 , ... sono facili da calcolare in O ( n ) tempo.h[ri]>h[ri−1]l1,l2,...r1,r2,…O(n)

Il caso in cui non ci sono tale che h [ i ] < h [ j ] (cioè f ( i , j ) > 0 ) è banale. Ci concentriamo ora su casi non banali. In tali casi, per trovare la soluzione, dobbiamo solo considerare tali coppie.i<jh[i]<h[j]f(i,j)>0

Per ogni tale che h [ i ] < h [ j ] , sia tu l'indice più grande tale che l u ≤ i , e v sia l'indice più piccolo tale che r v ≥ j , quindi h [ l u ] ≤ h [ i ] (altrimenti l u + 1 ≤ i per definizione di l u + 1i<jh[i]<h[j]ulu≤ivrv≥jh[lu]≤h[i]lu+1≤ilu+1, quindi in contraddizione con la definizione di ), e similmente h [ r v ] ≥ h [ j ] . Quindi ( h [ r v ] - h [ l u ] ) ( r v - l u ) ≥ ( h [ j ] - h [ i ] ) ( r v - l u ) ≥ ( h [uh[rv]≥h[j] Questo significa che dobbiamo considerare solo le coppie ( l u , r v ) dove l u < r v .

(h[rv]−h[lu])(rv−lu)≥(h[j]−h[i])(rv−lu)≥(h[j]−h[i])(j−i).
(lu,rv)lu<rv

Indica , abbiamo il seguente lemma.v(u)=arg⁡maxv: lu<rvf(lu,rv)

Una coppia cui , e dove esiste tale che e o tale che e , non può essere una soluzione ottimale finale.l u < r v u 0 u < u 0 v < v ( u 0 ) u > u 0 v > v ( u 0 )(lu,rv)lu<rvu0u<u0v<v(u0)u>u0v>v(u0)

Prova. Secondo la definizione di, abbiamo o ( h [ r v ( u 0 ) ] - h [ l u 0 ] ) ( r v ( u 0 ) - l u 0 ) ≥ ( h [ r v ] - h [ l u 0 ] ) ( r v - l u 0 ) , ( hv(u0)

(h[rv(u0)]−h[lu0])(rv(u0)−lu0)≥(h[rv]−h[lu0])(rv−lu0),
(h[rv]−h[rv(u0)])lu0+h[lu0](rv−rv(u0))+h[rv(u0)]rv(u0)−h[rv]rv(u0)≥0.

Nel caso in cui e , notare e , e anche e , abbiamo v < v ( u 0 ) h [ r v ] - h [ r v ( u 0 ) ] < 0 r v - r v ( u 0 ) > 0 l u < l u 0 h [ l u ] > h [ l u 0 ]u<u0v<v(u0)h[rv]−h[rv(u0)]<0rv−rv(u0)>0lu<lu0h[lu]>h[lu0]

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

Questo significa o

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

Quindi è una soluzione strettamente migliore di . La prova per l'altro caso è simile. (lu,rv(u0))(lu,rv)◼

Possiamo calcolare primo luogo dove è la lunghezza della sequenza , quindi calcolare ricorsivamente la soluzione ottimale tra 's per e e la soluzione ottimale tra 's per e . A causa del lemma, la soluzione ottimale globale deve provenire da .v(ℓ/2)ℓl1,l2,…o1(lu,rv)u=1,…,ℓ/2−1v=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) Soluzione

Sia se . La dimostrazione del lemma mostra anche una proprietà importante: per e , if , quindi . Ciò significa che la matrice è una matrice totalmente monotona in cui è la lunghezza della sequenza (quindi indica l' elemento -esimo dalla fine), quindi l'algoritmo SMAWK può essere applicato per trovare il valore minimo di , quindi il valore massimo di .f(lu,rv)=−∞lu≥rvu>u0v>v0f(lu0,rv0)≥f(lu0,rv)M [ x , y ] : = - f ( l x , r c - y + 1 ) c r 1 , r 2 , … r c - y + 1 y M ff(lu,rv0)>f(lu,rv)M[x,y]:=−f(lx,rc−y+1)cr1,r2,…rc−y+1yMf


1
Quello che hai dimostrato è che è una matrice monotona, quindi dividi e conquista fornisce un algoritmo . Ma potresti effettivamente dimostrare che è Monge , in modo che l' algoritmo SMAWK possa essere applicato. O ( n log n )f(lu,rv)O(nlog⁡n)O ( n )f(lu,rv)O(n)
— Willard Zhan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.