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


9

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

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

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

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

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


Поможет ли решение ? O(nlog⁡n)
— xskxzr

@xskxzr уверен, если у вас есть
— AspiringMat

Ответы:


5

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


O(nlog⁡n) решение

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

Определите l1=1 , и li будет наименьшим индексом, так что li>li−1 и h[li]<h[li−1] . Аналогично, определите r1=n , и ri будет наибольшим индексом, так что ri<ri−1 и h[ri]>h[ri−1] . Последовательности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 u ≤ i , и v будет наименьшим индексом, таким, что r v ≥ j , тогда h [ l u ] ≤ h [ i ] (иначе l u + 1 ≤ i по определению l u + 1я<Jчас[я]<час[J]ULU≤яvрv≥Jчас[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])(rv−lu)≥(h[j]−h[i])(rv−lu)≥(h[j]−h[i])(j−i).
(lu,rv)lu<rv

Обозначим , имеем следующую лемму.v(u)=arg⁡maxv: 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е


1
е(LU,рv)О(Nжурнал⁡N)е(LU,рv)О(N)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.