Apa Ukuran Gangguan yang digunakan saat Menganalisis Quicksort

9

Saya mencoba memahami mengapa quicksort menggunakan partisi Lomuto dan pivot yang tetap berkinerja tidak menentu, tetapi secara keseluruhan buruk, pada input yang dihasilkan secara acak. Saya berpikir bahwa meskipun input dihasilkan secara acak, mungkin ada banyak urutan urutan, tetapi saya tidak yakin bagaimana mengukur tingkat gangguan dalam urutan. Saya berpikir untuk menggunakan jumlah inversi, tetapi saya melihat dari pertanyaan lain ini saya bertanya bahwa itu bukan ukuran yang baik dalam kasus ini.

Alasan saya menduga bahwa urutan acak saya memiliki banyak "urutan" untuk mereka adalah bahwa mengacak pivot memperbaiki masalah kinerja. Namun secara teoritis seharusnya tidak ada masalah kinerja pada urutan input yang seharusnya "acak" ini.

Robert S. Barnes
sumber
Satu ukuran gangguan yang baik untuk hal semacam ini adalah kompleksitas Kolmogorov. Pada dasarnya dikatakan bahwa string yang paling tidak teratur adalah string yang tidak dapat dimampatkan. Ini mengarah ke metode inkompresibilitas, yang telah digunakan untuk melakukan hal-hal seperti analisis kasus rata-rata dari algoritma penyortiran, dan menemukan hubungan antara rata-rata dan analisis kasus terburuk.
Peter
Saya harus mencatat, bahwa saya seorang mahasiswa ... Saya sedang mencari sesuatu yang sedikit lebih lurus ke depan, seperti mungkin salah satu langkah dalam makalah ini (saya hanya tidak tahu yang mana): citeseerx.ist.psu. edu / viewdoc / ringkasan? doi = 10.1.1.45.8017
Robert S. Barnes
Pertanyaan terkait .
Raphael
Anda harus mencurigai kesalahan pemrograman daripada kasus pivoting musuh. Hanya mengurutkan urutan bilangan bulat acak dari 1 ke N untuk melihat apakah algoritme Anda mengurutkan!
Yves Daoust
lHaign!

Jawaban:

1

Lomuto vs Hoare
Partisi Lomuto menderita ketika menyortir tombol yang sama, sedangkan partisi Hoare tidak.
Kedua skema partisi menderita sama ketika menggunakan pivot jauh dari median.

Mengukur gangguan
Ukuran gangguan untuk memilih untuk keperluan quicksort sederhana.
A: Seberapa jauh dihapus dari median adalah pivot tetap, dibandingkan dengan data acak?
Jika Anda bersikeras menggunakan partisi Lomuto dan jika Anda menganggap nilai duplikat diizinkan, Anda perlu menambahkan tes berikut terhadap keacakan:
B: Ada berapa banyak elemen duplikat di sana, dibandingkan dengan acak.

Tentu saja agak konyol untuk mengasumsikan bahwa nilai duplikat diperbolehkan dalam kumpulan data Anda dan masih mengevaluasi partisi Lomuto, jadi Anda mungkin harus menghilangkan duplikat sebelumnya atau beralih ke partisi Hoare atau menganggap duplikat jarang terjadi.

Kedua ukuran itu sepele untuk diukur menggunakan statistik.

Kami dapat mengesampingkan data patologis
Penyimpangan lain dari keacakan tidak akan menjadi masalah untuk keperluan analisis quicksort. Selama pivot dekat dengan median, ia akan bekerja dengan baik pada semua data yang tidak patologis.
Jarak dari acak harus benar-benar hebat untuk menjadi quicksort-patologis, sehingga kita bisa mengesampingkan itu.

Jangan pernah menggunakan pivot tetap dalam kode nyata.
Perhatikan bahwa jika Anda menulis kode real dengan pivot tetap *) (apa pun pivot itu), Anda membuka diri terhadap penolakan serangan layanan, karena penyerang dapat menyisipkan nilai patologis pada titik itu dan dengan demikian Anda harus selalu memilih elemen acak sebagai pivot.

*) atau banyak pivot jika Anda memilih x pivot terbaik.

Johan
sumber