Secara efisien menemukan jumlah minimum transposisi yang diperlukan untuk mengurutkan daftar


8

Saya ingin metode yang efisien untuk menghitung jumlah minimum transposisi yang diperlukan untuk mengurutkan daftar. Saya tidak perlu tahu apa sebenarnya transposisi itu.

Misalnya, daftar [1, 1, 2, 0] membutuhkan 2 transposisi:

[1, 1, 2, 0] // Start
[1, 1, 0, 2] // Swap index 2 and 3
[0, 1, 1, 2] // Swap index 0 and 2

Daftar [0, 1, 0, 0] membutuhkan 1 transposisi:

[0, 1, 0, 0] // Start
[0, 0, 0, 1] // Swap index 1 and 3

Daftar [2, 2, 2, 2] membutuhkan 0 transposisi karena sudah diurutkan.

Beberapa informasi meta: 1) Daftar ini mungkin memiliki elemen berulang, jadi cukup menggunakan jarak Cayley antara pengurutan dan permutasi identitas tidak akan berfungsi . 2) Pertanyaan Math Overflow ini terkait.



1
Saya pikir jawaban yang diposting di sini harus digabung dengan pertanyaan 4096.
Tsuyoshi Ito

1
@derekhh, ini bukan duplikat (atau setidaknya interpretasi posting berbeda dalam pertanyaan lain). Saya ditautkan ke pertanyaan 4096 di pos asli.
emchristiansen

3
Pertanyaan 4096 tidak menyatakan bahwa elemen yang diberikan berbeda. Sayangnya, semua jawaban yang diposting di sana diam-diam mengasumsikan ini, dan pengawasan ini dapat diperbaiki dengan menggabungkan jawaban di sini ke sana.
Tsuyoshi Ito

1
@emchristiansen Ups, maaf, saya belum memperhatikan bahwa ...
derekhh

Jawaban:


7

Sayangnya, masalahnya adalah NP-hard secara umum, menurut Amir, Hartman, Kapah, Levy dan Porat (lihat http://epubs.siam.org/doi/abs/10.1137/080712969 ), bahkan jika setiap simbol paling banyak muncul tiga kali. Saya tidak menemukan penyebutan algoritma perkiraan faktor konstan, atau sesuatu yang cukup cepat untuk mengatasi masalah tersebut. Apakah ada batasan tambahan yang dapat Anda pikirkan dalam kasus Anda?

EDIT: penulis juga memberikan algoritma perkiraan 3/2, tapi saya tidak tahu apakah itu cukup baik untuk tujuan Anda.


Terima kasih untuk referensi. Saya berurusan dengan nilai piksel, jadi daftar bilangan bulat di [0, 255]. Panjang daftar umum adalah 256 elemen.
emchristiansen

Dapatkah Anda membuktikan, bahwa ketika Anda memiliki solusi (urutan transposisi penyortiran minimal), Anda selalu menukar angka besar di sebelah kiri dengan angka lebih kecil di sebelah kanan?
Ivan Kuckir
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.