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?


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.