def f(l):z=zip(l,range(len(l)));print map(sorted(z).index,z)
Cobalah online!
Menggunakan pengindeksan nol.
Algoritma cepat dengan ide sederhana. Jika kita malah perlu mengubah urutan daftar masukan untuk membuatnya sebagai dekat dengan (1,2,...,n) mungkin, kita harus hanya semacam itu, sebagaimana dibuktikan di bawah ini. Karena kita bukan permuting (1,2,...,n) , kita memilih permutasi yang memerintahkan cara yang sama seperti daftar input, seperti dalam tantangan sayaMeniru sebuah memesan(kecuali input mungkin memiliki mengulangi). (Sunting: mil menunjukkantantangan yang lebih identik ini, di mana Dennis memilikijawaban yang sama.)
Klaim: Sebuah permutasi dari daftar l yang meminimalkan jarak ke (1,2,...,n) adalahl diurutkan.
Bukti: Perhatikan beberapa permutasi lain l′ dari l . Kami akan membuktikan itu tidak bisa lebih baik daripada l diurutkan.
Pilih dua indeks i,j yang l′ memiliki out-of-order, di situlah i<j tetapi l′i>l′j . Kami menunjukkan bahwa swapping mereka tidak dapat meningkatkan jarak ke (1,2,...,n) . Kami perhatikan bahwa swap mengubah kontribusi kedua elemen ini sebagai berikut:
|l′i−i|+|l′j−j|→|l′i−j|+|l′j−i|.
Ini cara yang rapi untuk menunjukkan bahwa ini tidak bisa menjadi peningkatan. Pertimbangkan dua orang berjalan di garis bilangan, satu bergerak dari l′i ke i dan yang lainnya dari l′j ke j . Jarak total yang mereka tempuh adalah ekspresi di sebelah kiri. Karena i<j tetapi l′i>l′j , mereka beralih siapa yang lebih tinggi pada garis bilangan, yang berarti mereka harus menyeberang di beberapa titik selama berjalan mereka, sebut saja p . Tetapi ketika mereka mencapai p, mereka kemudian dapat menukar tujuan mereka dan berjalan dengan jarak total yang sama. Dan kemudian, tidak bisa lebih buruk bagi mereka untuk berjalan ke tujuan yang ditukar sejak awal daripada menggunakan p sebagai titik jalan, yang memberikan jarak total di sisi kanan.
Jadi, memilah dua out-of-order elemen dalam l′ membuat jarak ke (1,2,...,n) lebih kecil atau sama. Mengulangi proses ini pada akhirnya akan mengurutkan l . Jadi, l diurutkan setidaknya sebaik l′ untuk setiap pilihan l′ , yang berarti optimal atau terikat untuk optimal.
Perhatikan bahwa satu-satunya milik (1,2,...,n) yang kita digunakan adalah bahwa itu diurutkan, sehingga algoritma yang sama akan bekerja untuk mengubah urutan setiap daftar yang diberikan untuk meminimalkan jarak ke setiap daftar tetap.
Dalam kode, satu-satunya tujuan z=zip(l,range(len(l)))
adalah untuk membuat elemen input berbeda, yaitu untuk menghindari ikatan, sambil menjaga perbandingan yang sama antara elemen yang tidak sama. Jika input yang kami jamin tidak ada pengulangan, kami bisa menghapus ini dan hanya memilikinya lambda l:map(sorted(l).index,l)
.
v
, akan lebih besar dari0
? Atau, setidaknya, bukan0
?