Motivasi : Ketika mengembangkan alat untuk versi data, kami akhirnya mencari ke dalam algoritma untuk "membedakan" dua set bilangan bulat, dengan menghasilkan serangkaian transformasi yang membawa satu set bilangan bulat ke yang lain. Kami dapat mengurangi masalah itu menjadi masalah sangat alami berikut yang tampaknya memiliki koneksi untuk mengedit jarak, pengelompokan dengan swapping , dan minimum partisi string umum .
Masalah : Kami diberi string, yaitu urutan huruf, dan tujuan kami adalah menyeragamkannya dengan biaya minimum. Artinya, kami ingin urutan yang disusun ulang sehingga semua huruf yang sama bersebelahan.
Satu-satunya operasi yang diizinkan adalah untuk mengambil urutan surat yang sama, dan memindahkan urutan itu di mana saja, dan yang saya biaya 1 unit.
Bantuan apa pun yang menggambarkan kompleksitas masalah ini akan sangat dihargai!
Contoh :
- aabcdab: Input
- bcd aa ab: Setelah memindahkan aa pertama ke posisi tepat setelah "d"
- b bcdaaa: Setelah memindahkan trailing b ke posisi pertama
Karena string yang dihasilkan adalah homogen, kami memiliki biaya 2.
Perhatikan bahwa kami tidak dibatasi dengan cara apa pun sehubungan dengan output: selama itu homogen, kami tidak perlu memastikan urutan tertentu.
sumber
Lihatlah jumlah perubahan dari satu huruf ke huruf lainnya di string Anda, yang bisa Anda lihat sebagai ukuran untuk ketidakhomogenan string tersebut. Dengan setiap gerakan (berguna) dari urutan Anda mengurangi angka ini dengan satu jika gerakan berikutnya Anda didahului dan diikuti oleh dua huruf yang berbeda. Kalau tidak, Anda mengurangi ketidakhomogenan menjadi dua.
Jadi untuk string dengan perubahan k Anda membutuhkan paling banyak k - l + 1 bergerak di mana l adalah jumlah huruf yang berbeda dalam string, karena pada akhirnya l - 1 perubahan akan tetap. Karena sebuah string dengan panjang n dapat memiliki paling banyak n-1 perubahan huruf, ia dapat membutuhkan paling banyak n-l gerakan. Jumlah yang paling tidak mungkin adalah setengahnya.
Dengan demikian, strategi terbaik tampaknya adalah mencari bentuk abbba berikutnya dan memindahkan bbb dari sana. Ketika tidak ada yang tersisa, pindahkan apa pun. Anda masih bisa mencoba melakukan operasi yang menciptakan situasi abba baru, tapi saya pikir keuntungannya akan sangat sedikit. Karena strategi terburuk yang mungkin (tanpa gerakan konyol yang meningkatkan ketidakhomogenan) menggunakan paling banyak gerakan dua kali lebih banyak daripada yang optimal, sedikit yang mungkin Anda peroleh tampaknya tidak ada kaitannya dengan upaya seperti jawaban oleh isaacg dengan karakterisasi sebagai NP-hard menyarankan. Kecuali, tentu saja, Anda benar-benar hanya menghitung jumlah operasi pemindahan dan tidak peduli waktu untuk memutuskan gerakan mana yang akan diambil.
Karenanya, kasus terburuk adalah string di mana setiap huruf berbeda dari pendahulunya (dan Anda tidak mendapatkan bonus abba). Di sini Anda memerlukan sejumlah operasi linier dalam panjang string dan hampir sama dengan panjang ini.
Dalam contoh Anda, Anda memiliki 5 -> 4 -> 3 perubahan, dan 3 sama dengan jumlah huruf (4) minus 1.
Catatan: Untuk alfabet dengan ukuran hanya dua, setiap gerakan yang tidak memindahkan awalan atau akhiran dari string mengurangi inhomogenity oleh dua dan dengan demikian setiap urutan gerakan yang masuk akal adalah optimal.
sumber