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


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


Буде O(nlogn)рішення буде корисним?
xskxzr

@xskxzr впевнений, чи є у вас
AspiringMat

Відповіді:


5

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

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

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

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

Пара (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])(rvlu0),
або
(h[rv]h[rv(u0)])lu0+h[lu0](rvrv(u0))+h[rv(u0)]rv(u0)h[rv]rv(u0)0.

У випадку, коли u<u0 і v<v(u0), Примітка h[rv]h[rv(u0)]<0 і rvrv(u0)>0, а також lu<lu0 і h[lu]>h[lu0], ми маємо

(h[rv]h[rv(u0)])lu+h[lu](rvrv(u0))> (h[rv]h[rv(u0)])lu0+h[lu0](rvrv(u0)).

Це означає

(h[rv]h[rv(u0)])lu+h[lu](rvrv(u0))+h[rv(u0)]rv(u0)h[rv]rv(u0)>0,
або
(h[rv(u0)]h[lu])(rv(u0)lu)>(h[rv]h[lu])(rvlu).

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

Ми можемо обчислити v(/2) по-перше де - довжина послідовності l1,l2,, then recursively compute the optimal solution o1 among (lu,rv)'s for u=1,,/21 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 lurv. 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,rcy+1) is a totally monotone matrix where c is the length of the sequence r1,r2, (so rcy+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(nlogn) 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.