最大化する方法


9

私は常にアルゴリズムの問​​題をたくさん見ています。それは常に次のような長い行に還元されます。

あなたが持っている整数配列の、あなたは見つける必要がある、このような最大化するで時間。h[1..n]≥0i,j(h[j]−h[i])(j−i)O(n)

明らかに時間解はすべてのペアを考慮することですが、プロパティについて他に何も知らなくても式を最大化できる方法はありますか?O(n2)O(n)h

私が考えた1つのアイデアはを修正することです。それから、等しいからまでのを見つける必要がありますまたはあり、が固定されているため、。ji∗1j−1argmaxi{(h[j]−h[i])(j−i)}argmaxi{h[j]j−h[j]私−h[私]j+h[私]私}jargmax私{−h[j]私−jh[私]+私h[私]}

ただし、内部の従属項を取り除く方法はありません。何か助けは?j


ウィルソリューションが役に立ち?O(んログ⁡ん)
— xskxzr 2018

@xskxzrあるかどうか確認してください
— AspiringMat

回答:


5

これはO(んログ⁡ん)ソリューションです。この回答の最後に、Willard Zhanによって指摘されたO(ん)解が追加されています。


O(んログ⁡ん)ソリューション

convience、示すためにf(私、j)=(h[j]−h[私])(j−私)。

定義l1=1、およびl私、そのような最小の指標であることがl私>l私−1とh[l私]<h[l私−1]。同様に、定義r1=ん、及びr私最大インデックスようなものでr私<r私−1とh[r私]>h[r私−1]。シーケンスl1、l2、。。。また、r1、r2、…はO(ん)時間で簡単に計算できます。

がなく、h [ i ] < h [ j ](つまり、f (i 、j )> 0)である場合は、簡単です。ここでは、重要なケースに焦点を当てます。そのような場合、解決策を見つけるには、そのようなペアを検討するだけで済みます。私<jh[私]<h[j]f(私、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私<jh[私]<h[j]あなたlあなた≤私vrv≥jh[lu]≤h[i]lあなた+1≤私lあなた+1、こうしての定義に矛盾)、同様にH [ R V ] ≥ H [ J ]。従って (H [ R V ] - H [ L Uを ] )(R V - L U)≥ (H [ J ] - H [ I ] )(R V - L U)≥ (H [あなたh[rv]≥h[j] つまり、 l u < r vであるペア(l u、r v)のみを考慮する必要があります。

(h[rv]−h[lあなた])(rv−lあなた)≥(h[j]−h[私])(rv−lあなた)≥(h[j]−h[私])(j−私)。
(lあなた、rv)lあなた<rv

意味の、我々は次の補題を持っています。v(あなた)=arg⁡最高v: lあなた<rvf(lあなた、rv)

対L U < RのV、および場合があるUを0ように、U < U 0及びV < V (U 0)又はそのU > U 0及びV > V (U 0)は、最終的な最適解にはなりません。(lあなた、rv)lあなた<rvあなた0あなた<あなた0v<v(あなた0)あなた>あなた0v>v(あなた0)

証明。定義によれば、我々は (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(あなた0) または (H[RV]-H[R V (U 0) ])L U 0 +H[L、U 0 ](RV-R V (U 0))+H[Rの V (U 0) ]r v (u 0) −

(h[rv(あなた0)]−h[lあなた0])(rv(あなた0)−lあなた0)≥(h[rv]−h[lあなた0])(rv−lあなた0)、
(h[rv]−h[rv(あなた0)])lあなた0+h[lあなた0](rv−rv(あなた0))+h[rv(あなた0)]rv(あなた0)−h[rv]rv(あなた0)≥0。

あなた<あなた0v<v(あなた0)h[rv]−h[rv(あなた0)]<0rv−rv(あなた0)>0lあなた<lあなた0h[lあなた]>h[lあなた0]

(h[rv]−h[rv(あなた0)])lあなた+h[lあなた](rv−rv(あなた0))> (h[rv]−h[rv(あなた0)])lあなた0+h[lあなた0](rv−rv(あなた0))。

(h[rv]−h[rv(あなた0)])lあなた+h[lあなた](rv−rv(あなた0))+h[rv(あなた0)]rv(あなた0)−h[rv]rv(あなた0)>0、
(h[rv(あなた0)]−h[lあなた])(rv(あなた0)−lあなた)>(h[rv]−h[lあなた])(rv−lあなた)。

(lあなた、rv(あなた0))(lあなた、rv)◼

v(ℓ/2)ℓl1、l2、…o1(lあなた、rv)あなた=1、…、ℓ/2−1v=v(ℓ/2)、v(ℓ/2)+1、…o2(lあなた、rv)あなた=ℓ/2+1、ℓ/2+2、…v=1、…、v(ℓ/2){(lℓ/2、rv(ℓ/2))、o1、o2}


O(ん)

f(lあなた、rv)=−∞lあなた≥rvあなた>あなた0v>v0f(lあなた0、rv0)≥f(lあなた0、rv)f(lあなた、rv0)>f(lあなた、rv)M[x,y]:=−f(lx,rc−y+1)cr1,r2,…rc−y+1yMf


1
あなたが証明したのは f(lあなた、rv) は単調行列なので、分割統治は O(んログ⁡ん)アルゴリズム。しかし、あなたは実際にそれを証明することができますf(lあなた、rv)あるモンジュ、ので、O(ん) SMAWKアルゴリズムを適用できます。
— ウィラードジャン2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.