Cómo maximizar

9

Veo muchos problemas algorítmicos que siempre reducen a algo las líneas de:

Tiene una matriz entera h[1..n]0 , necesita encontrar i,j tal que maximice (h[j]h[i])(ji) en el tiempo O(n) .

Obviamente, la solución de tiempo O(n2) es considerar todos los pares, sin embargo, ¿hay alguna forma de maximizar la expresión en O(n) sin saber algo más sobre las propiedades de h ?

Una idea que pensé es arreglar j , luego necesitamos encontrar i de 1 a j-1 que sea igual a argmaxyo{(h[j]-h[yo])(j-yo)} o argmaxyo{h[j]j-h[j]yo-h[yo]j+h[yo]yo} y dado quej es fijo, entonces necesitamosargmaxi{h[j]ijh[i]+ih[i]} .

Sin embargo, no veo forma de deshacerme de los j términos dependientes en el interior. ¿Alguna ayuda?

Aspirante
fuente
¿ Será útil una solución ? O(norteIniciar sesiónnorte)
xskxzr
@xskxzr seguro si tienes alguno
AspiringMat

Respuestas:

5

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])(ji)

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=1lyoli>li1h[lyo]<h[lyo-1]r1=norteryoryo<ryo-1 . El secuencias l 1 , l 2 , . . . y r 1 , r 2 , ... son fáciles de calcular en tiempo O ( n ) .h[ryo]>h[ryo-1]l1,l2,...r1,r2,...O(norte)

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.yo<jh[yo]<h[j]F(yo,j)>0 0

Para cada tal que h [ i ] < h [ j ] , deja que u sea el índice más grande de tal manera que l ui , y v ser el índice más pequeño tal que r vj , entonces h [ l uyo<jh[yo]<h[j]tultuyovrvj (de lo contrario l u + 1i por definición de l u + 1h[ltu]h[yo]ltu+1yoltu+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 [tuh[rv]h[j] Esto significa que solo necesitamos considerar pares ( l u , r v ) donde l u < r v .

(h[rv]h[lu])(rvlu)(h[j]h[i])(rvlu)(h[j]h[i])(ji).
(lu,rv)lu<rv

Denote , tenemos el siguiente lema.v(u)=argmaxv: lu<rvf(lu,rv)

Un par donde l u < r v , y donde existe u 0 tal que u < u 0 y v < v ( u 0 ) o tal que u > u 0 y v > v ( u 0 ) , no puede ser una solución óptima final.(lu,rv)lu<rvu0u<u0v<v(u0)u>u0v>v(u0)

v(u0)

(h[rv(u0)]h[lu0])(rv(u0)lu0)(h[rv]h[lu0])(rvlu0),
(h[rv]h[rv(u0)])lu0+h[lu0](rvrv(u0))+h[rv(u0)]rv(u0)h[rv]rv(u0)0.

u<u0v<v(u0)h[rv]h[rv(u0)]<0rvrv(u0)>0lu<lu0h[lu]>h[lu0]

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

This means

(h[rv]h[rv(u0)])lu+h[lu](rvrv(u0))+h[rv(u0)]rv(u0)h[rv]rv(u0)>0,
or
(h[rv(u0)]h[lu])(rv(u0)lu)>(h[rv]h[lu])(rvlu).

So (lu,rv(u0)) is a strictly better solution than (lu,rv). Proof for the other case is similar.

We can compute v(/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,,/21 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}.


O(n) Solution

Let f(lu,rv)= if lurv. 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,rcy+1) is a totally monotone matrix where c is the length of the sequence r1,r2, (so rcy+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.

xskxzr
fuente
1
Lo que probaste es que F(ltu,rv) es una matriz monótona, así que dividir y conquistar da un O(norteIniciar sesiónnorte)algoritmo. Pero en realidad podrías probar queF(ltu,rv)es Monge , para que elO(norte) Se puede aplicar el algoritmo SMAWK .
Willard Zhan