Comment maximiser

9

Je vois de nombreux problèmes algorithmiques qui réduisent toujours à quelque chose de long:

Vous avez un tableau entier h[1..n]0 , vous devez trouver i,j tel que maximise (h[j]h[i])(ji) en temps O(n) .

Évidemment, la solution temporelle O(n2) consiste à considérer toutes les paires, mais y a-t-il un moyen de maximiser l'expression dans O(n) sans connaître autre chose des propriétés de h ?

Une idée à laquelle j'ai pensé est de fixer j , alors nous devons trouver i de 1 à j1 qui est égal à argmaxi{(h[j]h[i])(ji)} ou argmaxi{h[j]jh[j]ih[i]j+h[i]i} et puisquej est fixe, alors nous avons besoin d'argmaxje{-h[j]je-jh[je]+jeh[je]} .

Cependant, je ne vois aucun moyen de se débarrasser des j termes dépendants à l'intérieur. De l'aide?

AspiringMat
la source
Une solution sera-t-elle utile? O(nJournaln)
xskxzr
@xskxzr sûr si vous en avez
AspiringMat

Réponses:

5

Il s'agit d'une solution . Une solution O ( n ) signalée par Willard Zhan est annexée à la fin de cette réponse.O(nJournaln)O(n)


Solution O ( n log n )O(nJournaln)

Pour la convience, notons .F(je,j)=(h[j]-h[je])(j-je)

Définissez , et l i est le plus petit indice tel que l i > l i - 1 et h [ l i ] < h [ l i - 1 ] . De même, définissez r 1 = n , et r i est le plus grand indice tel que r i < r i - 1 et h [ r i ] >l1=1ljelje>lje-1h[lje]<h[lje-1]r1=nrjerje<rje-1 . Les séquences de l 1 , l 2 , . . . et r 1 , r 2 , sont faciles à calculer en temps O ( n ) .h[rje]>h[rje-1]l1,l2,...r1,r2,O(n)

Le cas où il n'y a pas de tel que h [ i ] < h [ j ] (ie f ( i , j ) > 0 ) est trivial. Nous nous concentrons maintenant sur les cas non triviaux. Dans de tels cas, pour trouver la solution, il suffit de considérer de telles paires.je<jh[je]<h[j]F(je,j)>0

Pour chaque tel que h [ i ] < h [ j ] , soit u le plus grand indice tel que l ui , et v le plus petit indice tel que r vj , alors h [ l u ] h [ i ] (sinon l u + 1i par définition de l u + 1je<jh[je]<h[j]ulujevrvjh[lu]h[je]lu+1jelu+1, contredit donc la définition de ), et de même h [ r v ] h [ j ] . Donc ( h [ r v ] - h [ l u ] ) ( r v - l u ) ( h [ j ] - h [ i ] ) ( r v - l u ) ( h [uh[rv]h[j] Cela signifie que nous devons seulement considérer les paires ( l u , r v ) l u < r v .

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

Notons , nous avons le lemme suivant.v(u)=argmaxv: lu<rvF(lu,rv)

Une paire l u < r v , et où il existe u 0 tel que u < u 0 et v < v ( u 0 ) ou tel que u > u 0 et v > v ( u 0 ) , ne peut être une solution optimale finale.(lu,rv)lu<rvu0u<u0v<v(u0)u>u0v>v(u0)

Preuve. Selon la définition de , nous avons ( 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 - lv(u0) ou (h[rv]-h[r v ( u 0 ) ])l u 0 +h[l u 0 ](rv-r v ( u 0 ) )+h[r v ( u 0 ) ]r v ( u 0 ) -

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

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

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

Donc (lu,rv(u0)) est une solution strictement meilleure que (lu,rv). La preuve pour l'autre cas est similaire.

Nous pouvons calculer v(/2) tout d'abord où est la longueur de la séquence l1,l2,, puis calculez récursivement la solution optimaleo1 parmi (lu,rv)c'est pour u=1,,/2-1 et v=v(/2),v(/2)+1,, et la solution optimale o2 parmi (lu,rv)c'est pour u=/2+1,/2+2, et v=1,,v(/2). En raison du lemme, la solution optimale globale doit provenir de{(l/2,rv(/2)),o1,o2}.


O(n) Solution

Laisser F(lu,rv)=- si lurv. La preuve du lemme montre également une propriété importante: pouru>u0 et v>v0, si F(lu0,rv0)F(lu0,rv), puis F(lu,rv0)>F(lu,rv). Cela signifie que la matriceM[X,y]: =-F(lX,rc-y+1) est une matrice totalement monotone où c est la longueur de la séquence r1,r2, (donc rc-y+1 signifie le y-th élément de la fin), l' algorithme SMAWK peut alors appliquer pour trouver la valeur minimale deM, donc la valeur maximale de F.

xskxzr
la source
1
Ce que vous avez prouvé, c'est que F(lu,rv) est une matrice monotone, donc diviser pour mieux régner donne un O(nJournaln)algorithme. Mais vous pourriez en fait prouver queF(lu,rv)est Monge , de sorte que leO(n) L'algorithme SMAWK peut être appliqué.
Willard Zhan