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])(j−i) 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 à j−1 qui est égal à argmaxi{(h[j]−h[i])(j−i)} ou argmaxi{h[j]j−h[j]i−h[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(nJournal⁡n)
— 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(nJournal⁡n)O(n)


Solution O ( n log n )O(nJournal⁡n)

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 u ≤ i , et v le plus petit indice tel que r v ≥ j , alors h [ l u ] ≤ h [ i ] (sinon l u + 1 ≤ i par définition de l u + 1je<jh[je]<h[j]ulu≤jevrv≥jh[lu]≤h[je]lu+1≤jelu+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 ) où l u < r v .

(h[rv]−h[lu])(rv−lu)≥(h[j]−h[i])(rv−lu)≥(h[j]−h[i])(j−i).
(lu,rv)lu<rv

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

Une paire où 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 lu≥rv. 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(nJournal⁡n)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.