Como maximizar


9

Eu vejo muitos problemas algorítmicos que sempre reduzem a algo longo as linhas de:

Você tem uma matriz inteira h[1..n]≥0 , precisa encontrar i,j tal que maximize (h[j]−h[i])(j−i) em O(n) tempo.

Obviamente, a solução do tempo de O(n2) é considerar todos os pares; no entanto, existe alguma maneira de maximizar a expressão em O(n) sem saber mais alguma coisa sobre as propriedades de h ?

Uma idéia em que pensei é consertar j , então precisamos encontrar i∗ de 1 a j−1 que seja igual a argmaxi{(h[j]−h[i])(j−i)} ou argmaxi{h[j]j−h[j]i−h[i]j+h[i]i} e comoj é fixo, precisamos doargmaxi{−h[j]i−jh[i]+ih[i]} .

No entanto, não vejo como me livrar dos j termos dependentes internos. Qualquer ajuda?


Uma solução O(nlog⁡n) será útil?
— Xskxzr

@xskxzr certeza se você tem algum
— AspiringMat

Respostas:


5

Esta é uma solução . Uma solução O ( n ) apontada por Willard Zhan é anexada no final desta resposta.O(nlog⁡n)O(n)


Solução O ( n log n )O(nlog⁡n)

Por conveniência, denote .f(i,j)=(h[j]−h[i])(j−i)

Defina e l i seja o menor índice, de modo que l i > l i - 1 e h [ l i ] < h [ l i - 1 ] . Da mesma forma, defina r 1 = n e r i seja o maior índice, de modo que r i < r i - 1 e h [ r i ] >l1=1lili>li−1h[li]<h[li−1]r1=nriri<ri−1 . A sequências de L 1 , L 2 , . . . e r 1 , r 2 , … são fáceis de calcular em O ( n ) tempo.h[ri]>h[ri−1]l1,l2,...r1,r2,…O(n)

O caso em que não há tal que h [ i ] < h [ j ] (isto é, f ( i , j ) > 0 ) é trivial. Agora nos concentramos em casos não triviais. Nesses casos, para encontrar a solução, precisamos apenas considerar esses pares.i<jh[i]<h[j]f(i,j)>0

Para cada tal que h [ i ] < h [ j ] , deixou u ser o maior índice de tal modo que l u ≤ i , e v ser o menor índice de tal modo que r v ≥ j , em seguida, h [ l u ] ≤ h [ i ] (caso contrário, l u + 1 ≤ i, por definição de l u + 1i<jh[i]<h[j]ulu≤ivrv≥jh[lu]≤h[i]lu+1≤ilu+1, portanto, contradiz a definição de ) e da mesma forma h [ r v ] ≥ h [ j ] . Portanto ( h [ r v ] - h [ l u ] ) ( r v - l u ) ≥ ( h [ j ] - h [ i ] ) ( r v - l u ) ≥ ( h [uh[rv]≥h[j] Isso significa que precisamos considerar apenas pares ( l u , r v ) onde 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

Denote , temos o seguinte lema.v(u)=arg⁡maxv: lu<rvf(lu,rv)

Um par que e onde exista tal que e ou tal que e , não possa ser uma solução ótima final.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. De acordo com a definição de, temos ou ( 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.

No caso em que e , observe e e também e , temos 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)).

Isso significa ou

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

Então é uma solução estritamente melhor que . A prova para o outro caso é semelhante. (lu,rv(u0))(lu,rv)◼

Podemos calcular primeiro onde é o comprimento da sequência e depois calcular recursivamente a solução ideal entre s para e e a solução ideal entre s para e . Devido ao lema, a solução ideal global deve vir de .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) Solução

Seja se . A prova do lema também mostra uma propriedade importante: para e , se , então . Isso significa que a matriz é uma matriz totalmente monótona em que é o comprimento da sequência (então significa o ésimo elemento do final), então o algoritmo SMAWK pode ser aplicado para encontrar o valor mínimo de , portanto, o valor máximo de .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


11
O que você provou é que é uma matriz monótona; portanto, dividir e conquistar fornece um algoritmo . Mas você pode realmente provar que é Monge , para que o algoritmo SMAWK possa ser aplicado. O ( N log N ) f ( l u , r v ) O ( n )f(lu,rv)O(nlog⁡n)f(lu,rv)O(n)
— Willard Zhan
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.