Diberi tabung dengan bola bernomor (acak). Tabung memiliki lubang untuk mengeluarkan bola. Pertimbangkan langkah-langkah berikut untuk satu operasi:
- Anda dapat memilih satu atau lebih bola dari lubang dan ingat urutan pengambilan bola tersebut.
- Anda perlu memiringkan pipa ke sisi kiri sehingga bola yang tersisa di pipa bergeser ke kiri dan menempati ruang kosong yang dibuat dengan menghapus bola.
- Anda tidak seharusnya mengubah urutan pengambilan bola bernomor dari pipa. Sekarang Anda menempatkan mereka kembali di pipa menggunakan ruang kosong yang diciptakan oleh gerakan bola.
Langkah 1 hingga 3 dianggap sebagai satu operasi.
Cari tahu operasi minimum yang diperlukan untuk mengurutkan bola bernomor dalam urutan menaik.
Misalnya: Jika tabung berisi:
Kemudian kita bisa mengeluarkan dan dan , dan jika kita memiringkan pipa ke kiri, kita dapatkan [ 1 2 3 ] , dan kita masukkan ( 4 5 6 ) agar ke ujung pipa untuk mendapatkan .5 6
Jadi jumlah minimum langkah yang diperlukan adalah 1. Saya perlu menemukan operasi minimum untuk menyortir pipa.
Adakah ide atau petunjuk tentang cara mengatasi masalah ini?
sorting
permutations
rakesh
sumber
sumber
Jawaban:
Tentukan nomor run-partisi dari permutasi , dilambangkan r ( π ) , menggunakan proses berikut. Biarkan k menjadi bilangan bulat maksimal sehingga angka min ( π ) , ... , k muncul dalam urutan yang meningkat dalam π . Hapus dari π , dan ulangi prosesnya. Jumlah putaran yang dibutuhkan untuk mengkonsumsi seluruh permutasi adalah r ( π ) .π r(π) k min(π),…,k π π r(π)
Sebagai contoh, mari kita hitung . Kami pertama-tama menyisihkan 1 , untuk mendapatkan 6273584 . Lalu kami menyisihkan 234 , untuk mendapatkan 6758 . Lalu kami menyisihkan 5 , untuk mendapatkan 678 . Akhirnya, kami menyisihkan 678 untuk mendapatkan permutasi kosong. Ini membutuhkan empat putaran, jadi r ( 62735814 ) = 4 .r(62735814) 1 6273584 234 6758 5 678 678 r(62735814)=4
Bagaimana representasi ini berguna untuk menyortir ? Ambil setiap menjalankan kedua, yaitu 234 , 678 , dan pindahkan angka-angka ini ke kanan untuk mendapatkan 51627384 (edit: dalam urutan mereka muncul dalam permutasi, yaitu 627384 ). Sekarang hanya ada dua run, yaitu 1234 , 5678 , dan kita dapat mengurutkan daftar dengan memindahkan 5678 ke kanan.62735814 234,678 51627384 627384 1234,5678 5678
Sekarang izinkan saya membuat dugaan berikut: Untuk permutasi , biarkan Π adalah himpunan semua permutasi yang dapat dijangkau dari π dalam satu gerakan. Kemudian min α ∈ Π r ( α ) = ⌈ r ( π ) / 2 ⌉ .π Π π minα∈Πr(α)=⌈r(π)/2⌉
Dengan dugaan ini, mudah untuk menunjukkan bahwa jumlah minimal gerakan yang diperlukan untuk mengurutkan permutasi adalah ⌈ log 2 r ( π ) ⌉ , dan saya telah memverifikasi rumus ini untuk semua permutasi dalam S n untuk n ≤ 8 .π ⌈log2r(π)⌉ Sn n≤8
Sunting: Berikut adalah interpretasi berbeda dari nomor run-partisi yang memberikan algoritma waktu linier untuk menghitungnya, dan memungkinkan saya untuk membuat sketsa bukti dugaan saya, sehingga memverifikasi rumus .⌈log2r(π)⌉
Pertimbangkan permutasi lagi. Alasan bahwa proses pertama berakhir pada 1 adalah bahwa 2 muncul sebelum 1 . Demikian pula, putaran kedua berakhir pada 4 karena 5 muncul sebelum 4 , dan seterusnya. Oleh karena itu jumlah run-partisi dari permutasi adalah jumlah i s sehingga saya + 1 muncul sebelum i .62735814 1 2 1 4 5 4 i i+1 i
Kita dapat menyatakan ini dengan lebih ringkas jika kita melihat kebalikan dari permutasi. Pertimbangkan lagi . Ambil π - 1 = 72485136 . Permutasi ini memiliki tiga keturunan: 7 2 48 5 1 36 (keturunan adalah posisi yang lebih kecil dari yang sebelumnya). Masing-masing keturunan sesuai dengan awal menjalankan baru. Jadi r ( π ) sama dengan satu ditambah jumlah keturunan pada π - 1 .π=62735814 π−1=72485136 72485136 r(π) π−1
Seperti apa operasi itu dalam hal ? biarkan B menjadi himpunan angka yang kita pindah ke kanan, dan A menjadi himpunan angka yang tetap di kiri. Kami mengganti angka dalam A dengan permutasi pada { 1 , … , | A | } mewakili urutan relatif mereka, dan ganti angka dalam B dengan permutasi pada { | A | + 1 , ... , | A | + | B | }π−1 B A A {1,…,|A|} B {|A|+1,…,|A|+|B|} . Misalnya, perhatikan langkah . Dalam hal permutasi terbalik, itu adalah 7 248 5 136 ↦ 2 468 1 357 . Jadi 75 dipetakan ke 21 dan 248136 dipetakan ke 468357 .62735814↦51627384 72485136↦24681357 75 21 248136 468357
Sebuah keturunan di π - 1 hilang setelah operasi hanya jika x ∈ A dan y ∈ B . Sebaliknya, dalam hal π - 1 , partisi menjadi A dan B berhubungan dengan A -runs dan B -runs; setiap kali B- run berakhir dan A- run dimulai, ada keturunan. Untuk "membunuh" keturunan, kita harus beralih dari A- run ke B…xy… π−1 x∈A y∈B π−1 A B A B B A A B -Lari. Jika kita membunuh dua keturunan, kita akan beralih di tengah dari run ke A- run, menimbulkan keturunan.B A
Argumen ini dapat diformalkan untuk menunjukkan bahwa jika muncul dari π melalui operasi, maka d ( α - 1 ) ≥ ⌊ d ( π - 1 ) / 2 ⌋ , di mana d ( ⋅ ) adalah jumlah keturunan. Ini setara dengan r ( α ) ≥ ⌈ r ( π ) / 2 ⌉α π d(α−1)≥⌊d(π−1)/2⌋ d(⋅) r(α)≥⌈r(π)/2⌉ , dengan demikian membuktikan satu arah dugaan saya. Arah lainnya lebih mudah, dan sudah diuraikan di atas: kita cukup menjalankan setiap detik dan mendorongnya ke kanan untuk mendapatkan permutasi memuaskan r ( α ) = ⌈ r ( π / 2 ) ⌉ .α r(α)=⌈r(π/2)⌉
sumber