Je vois de nombreux problèmes algorithmiques qui réduisent toujours à quelque chose de long:
Vous avez un tableau entier , vous devez trouver tel que maximise en temps .
Évidemment, la solution temporelle consiste à considérer toutes les paires, mais y a-t-il un moyen de maximiser l'expression dans sans connaître autre chose des propriétés de ?
Une idée à laquelle j'ai pensé est de fixer , alors nous devons trouver de à qui est égal à ou et puisque est fixe, alors nous avons besoin d' .
Cependant, je ne vois aucun moyen de se débarrasser des termes dépendants à l'intérieur. De l'aide?
algorithms
algorithm-analysis
optimization
AspiringMat
la source
la source
Réponses:
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(nlogn) O(n)
Solution O ( n log n )O(nlogn)
Pour la convience, notons .f(i,j)=(h[j]−h[i])(j−i)
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=1 li li>li−1 h[li]<h[li−1] r1=n ri ri<ri−1 . Les séquences de l 1 , l 2 , . . . et r 1 , r 2 , … sont faciles à calculer en temps O ( n ) .h[ri]>h[ri−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.i < j h [ i ] < h [ j ] F( i , 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 + 1i < j h [ i ] < h [ j ] u lu≤ i v rv≥ j h [ lu] ≤ h [ i ] lu + 1≤ i lu + 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 [u h [ rv] ≥ h [ j ]
Cela signifie que nous devons seulement considérer les paires ( l u , r v ) où l u < r v .
Notons , nous avons le lemme suivant.v ( u ) = argmaxv : l u< rvF( lu, rv)
Nous pouvons calculerv ( ℓ / 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} .
LaisserF( 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 .
la source