Як максимізувати в


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)рішення. AnO(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) час.

Випадок, коли таких немає i<j такий як h[i]<h[j] (тобто f(i,j)>0) тривіально. Зараз ми зосередимось на нетривіальних випадках. У таких випадках, щоб знайти рішення, нам потрібно лише розглянути такі пари.

Для кожного i<j такий як h[i]<h[j], дозволяє u бути найбільшим таким показником, що lu≤i, і v бути найменшим показником таким, що rv≥j, тоді h[lu]≤h[i] (інакше lu+1≤i за визначенням lu+1, таким чином суперечить визначенню u) тощо h[rv]≥h[j]. Звідси

(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), у нас є наступна лема.

Пара (lu,rv) де lu<rv, і там, де існує u0 такий як u<u0 і v<v(u0) або таке, що u>u0 і v>v(u0), не може бути остаточним оптимальним рішенням.

Доказ. Відповідно до визначення оv(u0), ми маємо

(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<u0 і v<v(u0), Примітка h[rv]−h[rv(u0)]<0 і rv−rv(u0)>0, а також lu<lu0 і h[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,
або
(h[rv(u0)]−h[lu])(rv(u0)−lu)>(h[rv]−h[lu])(rv−lu).

Тому (lu,rv(u0)) є суворо кращим рішенням, ніж (lu,rv). Доказ для іншого випадку аналогічний.◼

Ми можемо обчислити v(ℓ/2) по-перше де ℓ - довжина послідовності l1,l2,…, then recursively compute the optimal solution o1 among (lu,rv)'s for u=1,…,ℓ/2−1 and v=v(ℓ/2),v(ℓ/2)+1,…, and the optimal solution o2 among (lu,rv)'s for u=ℓ/2+1,ℓ/2+2,… and v=1,…,v(ℓ/2). Due to the lemma, the global optimum solution must come from {(lℓ/2,rv(ℓ/2)),o1,o2}.


O(n) Solution

Let f(lu,rv)=−∞ if lu≥rv. The proof of the lemma also shows an important property: for u>u0 and v>v0, if f(lu0,rv0)≥f(lu0,rv), then f(lu,rv0)>f(lu,rv). This means the matrix M[x,y]:=−f(lx,rc−y+1) is a totally monotone matrix where c is the length of the sequence r1,r2,… (so rc−y+1 means the y-th element from the end), then SMAWK algorithm can apply to find the minimum value of M, thus the maximum value of f.


1
What you proved is that f(lu,rv) is a monotone matrix, so divide and conquer gives an O(nlog⁡n) algorithm. But you could actually prove that f(lu,rv) is Monge, so that the O(n) SMAWK algorithm can be applied.
— Willard Zhan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.