Cara memaksimalkan di

9

Saya melihat banyak masalah algoritmik yang selalu mengecil menjadi sesuatu seperti:

Anda memiliki array integer , Anda harus menemukan sedemikian sehingga memaksimalkan dalam waktu .h[1 ..n]0saya,j(h[j]h[i])(ji)O(n)

Jelas solusi waktu adalah untuk mempertimbangkan semua pasangan, namun, adakah cara kita dapat memaksimalkan ekspresi dalam tanpa mengetahui hal lain tentang properti ?O(n2)O(n)h

Satu ide yang saya pikirkan adalah untuk memperbaiki , maka kita perlu menemukan dari hingga yang sama dengan atau dan karena sudah diperbaiki, maka kita memerlukan .ji1j1argmaxi{(h[j]h[i])(ji)}argmaxi{h[j]jh[j]ih[i]j+h[i]i}jargmaxi{h[j]ijh[i]+ih[i]}

Namun, saya tidak melihat cara menyingkirkan istilah tergantung di dalam. Ada bantuan?j

AspiringMat
sumber
Apakah solusi akan membantu? O(nlogn)
xskxzr
@xskxzr yakin jika Anda punya
AspiringMat

Jawaban:

5

Ini adalah solusi . Sebuah solusi ditunjukkan oleh Willard Zhan ditambahkan pada akhir jawaban ini.O ( n )O(nlogn)O(n)


O(nlogn) solusi

Untuk kenyamanan, tunjukkan .f(i,j)=(h[j]h[i])(ji)

Tentukan , dan menjadi indeks terkecil sehingga dan . Demikian pula, definisikan , dan menjadi indeks terbesar sehingga dan . Urutan dan mudah untuk dihitung dalam waktu .l i l i > l i - 1 h [ l i ] < h [ l i - 1 ] r 1 = n r i r i < r i - 1 h [ r i ] > h [ r i - 1 ] l 1 , l 2 , . . .l1=1lili>li1h[li]<h[li1]r1=nriri<ri1h[ri]>h[ri1]l1,l2,...r1,r2,O(n)

Kasus di mana tidak ada sehingga (yaitu ) adalah sepele. Kami sekarang fokus pada kasus-kasus non-sepele. Dalam kasus seperti itu, untuk menemukan solusinya, kita hanya perlu mempertimbangkan pasangan semacam itu.h [ i ] < h [ j ] f ( i , j ) > 0i<jh[i]<h[j]f(i,j)>0

Untuk setiap sehingga h [ i ] < h [ j ] , biarkan kamu menjadi indeks terbesar sehingga l ui , dan v menjadi indeks terkecil sehingga r vj , lalu h [ l u ] h [ i ] (jika tidak l u + 1i oleh definisi l u + 1i<jh[i]<h[j]uluivrvjh[lu]h[i]lu+1ilu+1, dengan demikian bertentangan dengan definisi ), dan juga h [ r v ] h [ j ] . Oleh karena itu ( h [ r v ] - h [ l u ] ) ( r v - l u ) ( h [ j ] - h [ i ] ) ( r v - l u ) ( h [uh[rv]h[j] Ini berarti kita hanya perlu mempertimbangkan pasangan ( l u , r v ) di mana l u < r v .

(h[rv]h[lu])(rvlu)(h[j]h[i])(rvlu)(h[j]h[i])(ji).
(lu,rv)lu<rv

Nyatakan , kita memiliki lemma berikut.v(u)=argmaxv: lu<rvf(lu,rv)

Sepasang mana l u < r v , dan di mana ada u 0 sehingga u < u 0 dan v < v ( u 0 ) atau sedemikian sehingga u > u 0 dan v > v ( u 0 ) , tidak bisa menjadi solusi optimal akhir.(lu,rv)lu<rvu0u<u0v<v(u0)u>u0v>v(u0)

Bukti. Menurut definisi , kita memiliki ( 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) atau (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(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.

Dalam kasus di mana dan v < v ( u 0 ) , catat h [ r v ] - h [ r v ( u 0 ) ] < 0 dan r v - r v ( u 0 ) > 0 , dan juga l u < l u 0 dan h [ l u ] > hkamu<kamu0v<v(kamu0)h[rv]-h[rv(kamu0)]<0rv-rv(kamu0)>0lkamu<lkamu0 , kita memiliki h[lkamu]>h[lkamu0]

(h[rv]-h[rv(kamu0)])lkamu+h[lkamu](rv-rv(kamu0))> (h[rv]-h[rv(kamu0)])lkamu0+h[lkamu0](rv-rv(kamu0)).

Ini berarti atau (h[ r v ( u 0 ) ]-h[ l u ])( r v ( u 0 ) - l u )>(h[ r v ]-h[ l u ])( r v - l u ).

(h[rv]-h[rv(kamu0)])lkamu+h[lkamu](rv-rv(kamu0))+h[rv(kamu0)]rv(kamu0)-h[rv]rv(kamu0)>0,
(h[rv(kamu0)]-h[lkamu])(rv(kamu0)-lkamu)>(h[rv]-h[lkamu])(rv-lkamu).

(lkamu,rv(kamu0))(lkamu,rv)

v(/2)l1,l2,...Hai1(lkamu,rv)kamu=1,...,/2-1v=v(/2),v(/2)+1,...Hai2(lkamu,rv)u=/2+1,/2+2,v=1,,v(/2){(l/2,rv(/2)),o1,o2}


O(n)

f(lu,rv)=lurvu>u0v>v0f(lu0,rv0)f(lu0,rv)f(lu,rv0)>f(lu,rv)M[x,y]:=f(lx,rcy+1)cr1,r2,rcy+1yMf

xskxzr
sumber
1
Apa yang Anda buktikan adalah itu f(lkamu,rv) adalah matriks monoton, jadi membagi dan menaklukkan memberi HAI(ncatatann)algoritma. Tapi Anda benar-benar bisa membuktikannyaf(lkamu,rv)adalah Monge , jadi ituHAI(n) Algoritma SMAWK dapat diterapkan.
Willard Zhan