Saya melihat banyak masalah algoritmik yang selalu mengecil menjadi sesuatu seperti:
Anda memiliki array integer , Anda harus menemukan sedemikian sehingga memaksimalkan dalam waktu .
Jelas solusi waktu adalah untuk mempertimbangkan semua pasangan, namun, adakah cara kita dapat memaksimalkan ekspresi dalam tanpa mengetahui hal lain tentang properti ?
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 .
Namun, saya tidak melihat cara menyingkirkan istilah tergantung di dalam. Ada bantuan?
algorithms
algorithm-analysis
optimization
AspiringMat
sumber
sumber
Jawaban:
Ini adalah solusi . Sebuah solusi ditunjukkan oleh Willard Zhan ditambahkan pada akhir jawaban ini.O ( n )O(nlogn) O(n)
Untuk kenyamanan, tunjukkan .f(i,j)=(h[j]−h[i])(j−i)
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=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)
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<j h[i]<h[j] f(i,j)>0
Untuk setiap sehingga h [ i ] < h [ j ] , biarkan kamu menjadi indeks terbesar sehingga l u ≤ i , dan v menjadi indeks terkecil sehingga r v ≥ j , lalu h [ l u ] ≤ h [ i ] (jika tidak l u + 1 ≤ i oleh definisi l u + 1i<j h[i]<h[j] u lu≤i v rv≥j h[lu]≤h[i] lu+1≤i lu+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 [u h[rv]≥h[j]
Ini berarti kita hanya perlu mempertimbangkan pasangan ( l u , r v ) di mana l u < r v .
Nyatakan , kita memiliki lemma berikut.v(u)=argmaxv: lu<rvf(lu,rv)
sumber