Eu vejo muitos problemas algorítmicos que sempre reduzem a algo longo as linhas de:
Você tem uma matriz inteira , precisa encontrar tal que maximize em tempo.
Obviamente, a solução do tempo de é considerar todos os pares; no entanto, existe alguma maneira de maximizar a expressão em sem saber mais alguma coisa sobre as propriedades de ?
Uma idéia em que pensei é consertar , então precisamos encontrar de a que seja igual a ou e como é fixo, precisamos do .
No entanto, não vejo como me livrar dos termos dependentes internos. Qualquer ajuda?
algorithms
algorithm-analysis
optimization
AspiringMat
fonte
fonte
Respostas:
Esta é uma solução . Uma solução O ( n ) apontada por Willard Zhan é anexada no final desta resposta.O(nlogn) O(n)
Solução O ( n log n )O(nlogn)
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=1 li li>li−1 h[li]<h[li−1] r1=n ri ri<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<j h[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<j h[i]<h[j] u lu≤i v rv≥j h[lu]≤h[i] lu+1≤i lu+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 [u h[rv]≥h[j]
Isso significa que precisamos considerar apenas pares ( l u , r v ) onde l u < r v .
Denote , temos o seguinte lema.v(u)=argmaxv: lu<rvf(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−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}
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≥rv u>u0 v>v0 f(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) c r1,r2,… rc−y+1 y M f
fonte