Memasukkan secara efisien ke dalam daftar dengan menjaga jumlah inversi minimal


15

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.


Makanan untuk dipikirkan: Pendekatan naif adalah: Ambil satu elemen dari s, bandingkan dengan setiap elemen di u dari kiri ke kanan, tambahkan jika itu 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 berjalan di O (| s | * | u |) dengan spasi = O (| u |)
trevore

1
Memeriksa semua peningkatan jumlah maksimal dapat mengarah ke suatu tempat.
Raphael

Jawaban:


2

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. sJika 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 σ 1s1<s2σ1s1s2s1β1s1σ2β2s2 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β1s1s2β1+β2σ2+σ11

Tidak sulit untuk melihat bahwa elemen dapat dimasukkan secara independen. sSejak mereka diperintahkan, elemen-elemen tidak "merasakan" kehadiran satu sama lain. Artinya, pasangan elemen dari s tidak berkontribusi pada jumlah inversi. Untuk melakukannya, masukkan median ssss 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 | , linierkT(|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 | ) .sT(|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|us|u|su harus memerlukan kerja linear.


Terima kasih telah menjelaskan. Itulah solusi yang saya maksudkan.
trevore

1

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.


Saya tidak mengerti ini. s adalah input. Anda tidak dapat menganggap bahwa s berada dalam urutan terurut. Algoritme Anda harus bekerja untuk semua nilai s yang mungkin.
DW

Ya, tetapi dalam solusi optimal apa pun elemen s akan selalu berakhir diurutkan secara menaik dalam array baru. Perhatikan langkah "Sortir s." Lihat contoh di atas. Apa yang saya buktikan sejauh ini adalah: untuk a, b in s, a <b jika a ditempatkan secara optimal di Anda, maka tempat optimal untuk b adalah di sebelah kanan a.
trevore
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.