Ini adalah semacam pertanyaan jarak edit, dan sangat mudah. Saya benar-benar mati otak tentang hal ini dan tidak bisa mengetahuinya sejauh ini.
Diberikan serangkaian angka, mis
[3, 1, 1, 1]
Bagaimana cara yang paling efisien mengubah semua angka menjadi angka yang sama, dengan jumlah minimum "bergerak"? Dengan "bergerak" berarti menambah atau menghapus satu dari nomor.
Dalam contoh di atas, gerakan paling efisien adalah:
[1, 1, 1, 1]
Ini akan membutuhkan 2 gerakan, mengurangi angka pertama dua kali.
Saya tidak dapat menemukan cara terbaik untuk mengetahuinya, mengingat susunan ratusan angka yang jauh lebih besar.
Saya awalnya mencoba menghitung angka rata-rata bulat (jumlah semua dibagi dengan panjang), dan kemudian menguranginya menjadi rata-rata yang dihitung, tetapi contoh di atas mematahkan ini, membutuhkan 4 langkah alih-alih 2.
Saya kira saya bisa membayangkan:
- Rata-rata,
- Mode,
- Median
dan dapatkan jarak edit masing-masing, pilih jarak minimum. Namun, saya tidak yakin ini benar dalam setiap contoh. Bagaimana saya bisa tahu?
sumber
Jawaban:
Jawabannya adalah dengan mengambil median. Salah satu sifat median adalah meminimalkan jarak L1 ke setiap elemen. (Untuk memahami artikel Wikipedia, ambil distribusi probabilitas untuk menjadi distribusi yang seragam di atas seri angka asli Anda).
Ini adalah algoritma yang memecahkan masalah (aslinya ditulis oleh dc2 ):
sumber
sumber
Masalahnya dapat dirumuskan sebagai masalah LP:
EDIT : Seperti yang ditunjukkan dalam komentar, fungsi objektif harus dijumlahkan berdasarkan perbedaan absolut. Untuk mengubahnya kembali menjadi LP standar, kita dapat menulis ulang LP sebagai:
tunduk pada:
sumber