Asumsikan dua daftar item yang sebanding: u dan s. Biarkan INV (u) menjadi jumlah inversi di u.
Saya mencari algoritma yang efisien untuk memasukkan item s ke u dengan peningkatan minimal INV (u).
Pada dasarnya saya ingin memasukkan objek ke dalam daftar sambil menjaganya "sedapat mungkin diurutkan" sambil menjaga urutan daftar pertama.
Contoh:
u = [4,6,2,9,7]
INV(u) = 3 ((4, 2), (6, 2) and (9, 7)
s = [8,3,10]
one optimal solution u' = [3, 4, 6, 2, 8, 9, 7, 10]
INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (8,7))
different optimal solution u' = [3, 4, 6, 2, 9, 7, 8, 10]
INV(u') = 5 ((4, 2), (7, 2) and (9, 7) + (3,2), (9,8))
Seperti yang Anda lihat tidak ada solusi optimal yang unik.
Saya akan senang untuk segala jenis ide atau arahan untuk melihat ke dalam.
algorithms
sorting
trevore
sumber
sumber
Jawaban:
Ini adalah penjabaran dari jawaban trevore. Terlalu lama untuk memuat komentar dan berisi bukti dari solusinya (atau setidaknya bagaimana saya memahaminya).
Anda dapat menunjukkan bahwa dalam solusi optimal apa pun, elemen akan muncul diurutkan.s Jika tidak, asumsikan dan mereka muncul dalam urutan terbalik dalam solusi optimal. Misalkan σ 1 menjadi jumlah elemen antara s 1 dan s 2 yang kurang dari s 1 dan β 1 menjadi jumlah elemen yang lebih besar dari s 1 . Tentukan σ 2 dan β 2 sama untuk s 2 . Perhatikan bahwa σ 1 ≤s1<s2 σ1 s1 s2 s1 β1 s1 σ2 β2 s2 dan β 2 ≤ β 1 . Mengganti s 1 dan s 2 akan mengubah jumlah inversi dengan - β 1 + β 2 - σ 2 + σ 1 - 1 yang paling banyak -1.σ1≤σ2 β2≤β1 s1 s2 −β1+β2−σ2+σ1−1
Tidak sulit untuk melihat bahwa elemen dapat dimasukkan secara independen.s Sejak mereka diperintahkan, elemen-elemen tidak "merasakan" kehadiran satu sama lain. Artinya, pasangan elemen dari s tidak berkontribusi pada jumlah inversi. Untuk melakukannya, masukkan median ss s s secara optimal dalam waktu linier. Kemudian, secara rekursif, masukkan elemen kurang dari median ke kiri median dan elemen lebih besar dari median ke kanan.s
Biarkan median dimasukkan dalam posisi , runtime dari ini memenuhi, T ( | s | , | u | ) = T ( | s | / 2 , | u | - k ) + T ( | s | / 2 , k ) + | kamu | + | s | , linierk T(|s|,|u|)=T(|s|/2,|u|−k)+T(|s|/2,k)+|u|+|s| |s| faktor adalah untuk menemukan median dan mengocok elemen . Mudah untuk ditunjukkan dengan induksi bahwa T ( | s | , | u | ) = O ( | s | log | s | + | u | log | s | ) .s T(|s|,|u|)=O(|s|log|s|+|u|log|s|)
Perhatikan bahwa ketergantungan pada di sini optimal. Sejak memecahkan masalah dengan kosong u setara dengan menyortir s hanya menggunakan perbandingan. Ketergantungan pada | kamu | juga optimal, karena masalah untuk daftar tunggal s dan daftar u|s| u s |u| s u harus memerlukan kerja linear.
sumber
Ok, ini solusinya:
Pengamatan (yang kurang lebih saya buktikan) adalah bahwa solusi optimal akan selalu menjadi solusi di mana s diurutkan secara naik. Ini menimbulkan algoritma O ((| u | + | s |) * log (| s |)).
Untuk menemukan solusi optimal untuk satu elemen, lakukan seperti yang saya katakan di komentar saya: Ambil satu elemen dari s, bandingkan dengan setiap elemen di u dari kiri ke kanan, tambahkan penghitung adalah inversi dan bawa nomor yang sebelumnya dihitung. Kemudian lintasi daftar dari kanan ke kiri dengan elemen yang sama, menambah jumlah untuk setiap posisi.
Ini O (| u |).
Sortir s.
Untuk elemen tengah s pada posisi m: Temukan posisi terbaik b in u (menggunakan metode dari atas).
Pisahkan s pada m dan u di b dan panggil secara rekursif dengan bagian kiri dan kanan, gabungkan hasilnya dengan m dalam urutan yang benar.
Hentikan segera setelah Anda kosong.
sumber