Mari kita mulai dengan pengamatan berikut:
Biarkan max menunjukkan maksimum urutan a1,...,an , dan biarkan min menunjukkan minimumnya. Jika a1=max , maka memilih b1=b2=...=bn=⌊(max+min)/2⌋ adalah optimal.
Mengapa demikian? Ya, karena urutan dimulai dengan maksimum, baik kita memilih besar, dan menderita penyimpangan besar dari minimum urutan (karena setiap berikutnya harus lebih besar atau sama dengan ), atau kita memilih kecil dan menderita dari deviasi ke . Rata-rata meminimalkan deviasi maksimal.b i b 1 b 1 m a xb1bib1b1max
Kita sekarang dapat mencoba menggeneralisasi pengamatan ini untuk digunakan pada urutan umum . Sebagai contoh, kita dapat mempartisi urutan apa pun menjadi urutan, sehingga masing-masing dimulai dengan maksimum urutan berikutnya.a1,...,an
Contoh: dipartisi menjadi , , dan .( 2 ) ( 6 , 4 , 1 , 5 , 2 ) ( 8 , 7 , 5 , 1 )(2,6,4,1,5,2,8,7,5,1)(2)(6,4,1,5,2)(8,7,5,1)
Dengan diberikannya partisi ini, sekarang kita dapat menyelesaikan setiap ini secara terpisah, dan mendapatkan penugasan dari , yang bagaimanapun dapat melanggar kondisi yang tidak menurun. Ini dapat diperbaiki tanpa kehilangan optimalitas.bi
Perhatikan bahwa urutan terakhir selalu berisi maksimum dari seluruh urutan (jika tidak, akan ada urutan berikutnya setelahnya). Biarkan menjadi nilai yang kami tetapkan untuk sesudahnya. Sekarang, untuk mencapai non-penurunan di , kita mulai dari belakang di dan bekerja terus ke depan. Jika lebih besar dari , kami cukup menetapkan . Jika lebih kecil, kami menyimpannya. Kemudian, kita lanjutkan dengan membandingkan dengan dan seterusnya. Perhatikan bahwa menurunkan apa pun ke nilaiw 1 , w 2 , . . . , W k k w 1 , . . . , w k w k w k - 1 w k w k - 1 : = w k w k - 2 w k - 1 w i w i + 1 w i w i + 1maxw1,w2,...,wkkw1,...,wkwkwk−1wkwk−1:=wkwk−2wk−1wiwi+1tidak pernah meningkatkan deviasi, karena nilai pepatium pada baris berikutnya yang ditentukan dengan selalu lebih rendah dari maksimum pada baris berikutnya yang ditetapkan dengan .wiwi+1
Algoritma ini seharusnya benar, saya pikir. Mengenai waktu berjalan, langkah kuncinya adalah menghitung peningkatan maksimum untuk urutan berikutnya, yang mungkin dilakukan dalam ? Tidak yakin dari mana berkontribusi.lO(n)l
Saya pikir ini harus bisa dilakukan di O (n).
Ambil masalah yang sama: Mengingat , 1 ≤ i ≤ n, dan d ≥ 0, menemukan b i di non-urutan seperti itu | a i - b i | ≤ d untuk semua i, atau menunjukkan bahwa itu tidak mungkin. Ini dapat dilakukan di O (n), dan menggunakan pencarian biner masalah asli diselesaikan dalam O (n log l).ai bi |ai−bi|≤d
Sekarang jika ada saya ≤ j sehingga a_i - a_j> 2d, maka tidak ada solusi (karena ).bi≥ai−d,bj≤aj+d<ai−2d+d=ai−d≤bi
Tetapi jika a_i - a_j ≤ 2d untuk semua saya ≤ j maka saya pikir solusi akan selalu ditemukan. Jadi yang harus kita lakukan adalah mencari m = max (a_i - a_j) untuk semua i ≤ j, dan pilih d = floor ((m + 1) / 2). Maksimum itu dapat ditemukan di O (n).
sumber