Veo muchos problemas algorítmicos que siempre reducen a algo las líneas de:
Tiene una matriz entera , necesita encontrar tal que maximice en el tiempo .
Obviamente, la solución de tiempo es considerar todos los pares, sin embargo, ¿hay alguna forma de maximizar la expresión en sin saber algo más sobre las propiedades de ?
Una idea que pensé es arreglar , luego necesitamos encontrar de a que sea igual a o y dado que es fijo, entonces necesitamos .
Sin embargo, no veo forma de deshacerme de los términos dependientes en el interior. ¿Alguna ayuda?
algorithms
algorithm-analysis
optimization
Aspirante
fuente
fuente
Respuestas:
Esta es una solución . Al final de esta respuesta se adjunta una solución O ( n ) señalada por Willard Zhan .O(nlogn) O(n)
Solución O ( n log n )O(nlogn)
Para conveniencia, denote .f(i,j)=(h[j]−h[i])(j−i)
Defina , y l i será el índice más pequeño de modo que l i > l i - 1 y h [ l i ] < h [ l i - 1 ] . Del mismo modo, defina r 1 = n , y r i será el índice más grande de modo que r i < r i - 1 y h [ r i ] >l1=1 li li>li−1 h [lyo] < h [li - 1] r1= n ryo ryo< ri - 1 . El secuencias l 1 , l 2 , . . . y r 1 , r 2 , ... son fáciles de calcular en tiempo O ( n ) .h [ ryo] > h [ ri - 1] l1, l2, . . . r1, r2, ... O ( n )
El caso donde no hay tal que h [ i ] < h [ j ] (es decir, f ( i , j ) > 0 ) es trivial. Ahora nos enfocamos en casos no triviales. En tales casos, para encontrar la solución, solo necesitamos considerar tales pares.i < j h [ i ] < h [ j ] F( i , j ) > 0
Para cada tal que h [ i ] < h [ j ] , deja que u sea el índice más grande de tal manera que l u ≤ i , y v ser el índice más pequeño tal que r v ≥ j , entonces h [ l ui < j h [ i ] < h [ j ] tu ltu≤ i v rv≥ j (de lo contrario l u + 1 ≤ i por definición de l u + 1h [ ltu] ≤ h [ i ] lu + 1≤ i lu + 1 , por lo tanto, contradice la definición de ), y de manera similar h [ r v ] ≥ h [ j ] . Por lo tanto
( h [ r v ] - h [ l u ] ) ( r v - l u ) ≥ ( h [ j ] - h [ i ] ) ( r v - l u ) ≥ ( h [tu h [ rv]≥h[j]
Esto significa que solo necesitamos considerar pares ( l u , r v ) donde l u < r v .
Denote , tenemos el siguiente lema.v(u)=argmaxv: lu<rvf(lu,rv)
We can computev(ℓ/2) firstly where ℓ is the length of the sequence l1,l2,… , then recursively compute the optimal solution o1 among (lu,rv) 's for u=1,…,ℓ/2−1 and v=v(ℓ/2),v(ℓ/2)+1,… , and the optimal solution o2 among (lu,rv) 's for u=ℓ/2+1,ℓ/2+2,… and v=1,…,v(ℓ/2) . Due to the lemma, the global optimum solution must come from {(lℓ/2,rv(ℓ/2)),o1,o2} .
Letf(lu,rv)=−∞ if lu≥rv . The proof of the lemma also shows an important property: for u>u0 and v>v0 , if f(lu0,rv0)≥f(lu0,rv) , then f(lu,rv0)>f(lu,rv) . This means the matrix M[x,y]:=−f(lx,rc−y+1) is a totally monotone matrix where c is the length of the sequence r1,r2,… (so rc−y+1 means the y -th element from the end), then SMAWK algorithm can apply to find the minimum value of M , thus the maximum value of f .
fuente