Как максимизировать в

9

Я вижу много алгоритмических проблем, которые всегда сводятся к чему-то длинному:

У вас есть целочисленный массив , вам нужно найти такое, что максимизирует за времени.h[1..n]0i,j(h[j]h[i])(ji)O(n)

Очевидно, что временное решение состоит в том, чтобы рассмотреть все пары, однако есть ли способ максимизировать выражение в не зная ничего о свойствах ?O(n2)O(n)h

Одна идея, о которой я подумал, это исправить , тогда нам нужно найти от до , равный или и поскольку фиксировано, нам нужно .ji1j1argmaxi{(h[j]h[i])(ji)}argmaxi{h[j]jh[j]ih[i]j+h[i]i}jargmaxi{h[j]ijh[i]+ih[i]}

Тем не менее, я не вижу способа избавиться от зависимых терминов внутри. Любая помощь?j

AspiringMat
источник
Поможет ли решение ? O(nlogn)
xskxzr
@xskxzr уверен, если у вас есть
AspiringMat

Ответы:

5

Это решение O(nlogn) . O ( п ) решение указывало Willard Zhan добавляются в последнем из этого ответа.O(n)


O(nlogn) решение

Для удобства обозначим f(i,j)=(h[j]h[i])(ji) .

Определите l1=1 , и li будет наименьшим индексом, так что li>li1 и h[li]<h[li1] . Аналогично, определите r1=n , и ri будет наибольшим индексом, так что ri<ri1 и h[ri]>h[ri1] . Последовательностиl1,l2,...иr1,r2, легко вычислить заO(n) время.

Случай, когда нет такого, что h [ i ] < h [ j ] (т. Е. F ( i , j ) > 0 ), тривиален. Теперь сосредоточимся на нетривиальных случаях. В таких случаях, чтобы найти решение, нам нужно только рассмотреть такие пары.i<jчас[я]<час[J]е(я,J)>0

Для каждого такого, что h [ i ] < h [ j ] , пусть u будет наибольшим индексом, таким, что l ui , и v будет наименьшим индексом, таким, что r vj , тогда h [ l u ] h [ i ] (иначе l u + 1i по определению l u + 1я<Jчас[я]<час[J]ULUяvрvJчас[LU]час[я]LU+1яLU+1Таким образом, противоречит определению ), и аналогично h [ r v ] h [ j ] . Следовательно ( ч [ г V ] - ч [ л у ] ) ( г V - л U ) ( ч [ J ] - ч [ я ] ) ( г V - л у ) ( ч [Uчас[рv]час[J] Это означает, что нам нужно рассматривать только пары ( 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

Обозначим , имеем следующую лемму.v(u)=argmaxv: lu<rvf(lu,rv)

Пара где l u < r v и где существует u 0, такое что u < u 0 и v < v ( u 0 ) или такое, что u > u 0 и v > v ( u 0 ) , не может быть окончательным оптимальным решением.(lu,rv)lu<rvu0u<u0v<v(U0)U>U0v>v(U0)

Доказательство. Согласно определению , мы имеем ( 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) или (ч[гV]-ч[г V ( U 0 ) ])л у 0 +ч[л у 0 ](гV-г V ( U 0 ) )+ч[г V ( U 0 ) ]r v ( u 0 ) -

(час[рv(U0)]-час[LU0])(рv(U0)-LU0)(час[рv]-час[LU0])(рv-LU0),
(час[рv]-час[рv(U0)])LU0+час[LU0](рv-рv(U0))+час[рv(U0)]рv(U0)-час[рv]рv(U0)0.

В случае, когда и v < v ( u 0 ) , заметим, что h [ r v ] - h [ r v ( u 0 ) ] < 0 и r v - r v ( u 0 ) > 0 , а также l u < l u 0 и h [ l u ] > hU<U0v<v(U0)час[рv]-час[рv(U0)]<0рv-рv(U0)>0LU<LU0 , мы имеем час[LU]>час[LU0]

(час[рv]-час[рv(U0)])LU+час[LU](рv-рv(U0))> (час[рv]-час[рv(U0)])LU0+час[LU0](рv-рv(U0)),

(час[рv]-час[рv(U0)])LU+час[LU](рv-рv(U0))+час[рv(U0)]рv(U0)-час[рv]рv(U0)>0,
(час[рv(U0)]-час[LU])(рv(U0)-LU)>(час[рv]-час[LU])(рv-LU),

(LU,рv(U0))(LU,рv)

v(/2)L1,L2,...о1(LU,рv)Uзнак равно1,...,/2-1vзнак равноv(/2),v(/2)+1,...о2(LU,рv)Uзнак равно/2+1,/2+2,...vзнак равно1,...,v(/2){(L/2,рv(/2)),о1,о2}


О(N)

е(LU,рv)знак равно-LUрvU>U0v>v0е(LU0,рv0)е(LU0,рv)е(LU,рv0)>е(LU,рv)M[Икс,Y]знак равно-е(LИкс,рс-Y+1)ср1,р2,...рс-Y+1YMе

xskxzr
источник
1
е(LU,рv)О(NжурналN)е(LU,рv)О(N)