Aplikasi Praktis Sortir Radix

20

Urutan radix secara teoritis sangat cepat ketika Anda tahu bahwa kunci berada dalam kisaran terbatas tertentu, katakanlah nilai dalam kisaran misalnya. Jika Anda baru saja mengonversi nilai menjadi basis yang membutuhkan waktu , lakukan pengurutan basis radix dan kemudian konversikan kembali ke basis asli Anda untuk keseluruhan algoritma .n[0...nk-1]k<lgnnΘ(n)nΘ(nk)

Namun, saya telah membaca bahwa dalam prakteknya jenis radix biasanya jauh lebih lambat daripada melakukan misalnya quicksort acak :

Untuk array besar, radix sort memiliki jumlah instruksi terendah, tetapi karena kinerjanya yang relatif buruk, kinerja keseluruhannya lebih buruk daripada versi mergesort dan quicksort yang dioptimalkan untuk memori.

Apakah radix sort hanya algoritma teoretis yang bagus, atau apakah ia memiliki kegunaan praktis yang umum?

Robert S. Barnes
sumber

Jawaban:

15

Jenis radix sering, dalam praktiknya, jenis tercepat dan paling berguna pada mesin paralel.

Pada setiap node multiprosesor Anda mungkin melakukan sesuatu seperti quicksort, tetapi radix sort memungkinkan banyak node untuk bekerja bersama dengan sinkronisasi yang lebih sedikit daripada berbagai macam rekursif.

Ada situasi lain juga. Jika Anda memerlukan jenis stabil (semacam ketika setiap dua kunci sama mereka tetap dalam urutan yang sama daripada disusun ulang) maka saya tidak mengetahui versi quicksort yang akan digunakan. Mergesort juga stabil (jika diterapkan dengan benar). Tautan Anda adalah pertama kalinya saya pernah mendengar seseorang mengatakan bahwa mergesort dapat dibuat memiliki perilaku cache yang lebih baik daripada radix sort.

Logika Pengembaraan
sumber
Patterson dan Hennessy membuat poin yang sama dengan kertas yang dihubungkan di atas oleh Lamarca dalam buku mereka, Computer Organisation and Design.
Robert S. Barnes
Penyebutan Anda tentang Patterson mengingatkan saya pada pekerjaan penting yang dilakukan Andrea Arpaci-Dusseau pada pengelompokan cluster sekitar 15 tahun yang lalu. (Patterson adalah rekan penulis). Dalam makalah 1997 mereka benar-benar memutuskan bahwa jenis radix parsial lebih disukai daripada quicksort pada node individu juga. (Saya menambahkan referensi ke jawabannya).
Pengembaraan Logika
Itu menarik. Dalam edisi keempat 2009 dari CompOrg mereka mereferensikan karya Lamarca pada versi sebelumnya dari Radix sort menjadi cache tidak ramah (hal 489), tetapi kemudian pada halaman 490 di bawah grafik membandingkan Quicksort dan Radix sort mereka berkata, "Karena hasil seperti itu, versi baru dari Radix sort telah ditemukan yang memperhitungkan hirarki memori, untuk mendapatkan kembali kelebihan algoritmiknya. Saya ingin tahu bagaimana versi baru Radix Sort ini beroperasi.
Robert S. Barnes
Kecurigaan saya adalah bahwa Lamarca hanya menggunakan semacam radix bodoh (yang menyimpan ember sebagai daftar tertaut.) Tidak ada yang akan melakukan itu. Anda akan mengimplementasikan bucket menggunakan semacam array dinamis yang dioptimalkan (misalnya, seperti C ++ vector). Tapi saya tidak tahu, karena saya belum membaca koran Lamarca.
Pengembaraan Logika
@WanderingLogic di mana radix sort menggunakan bucket? Apakah yang Anda maksudkan semacam ember di sini?
Bar
3

@ Robert: Tautan Anda cukup mengejutkan (sebenarnya saya tidak dapat menemukan kalimat yang dikutip). Pengalaman pribadi saya adalah untuk input acak, jenis radix jauh lebih cepat daripada STL std::sort(), yang menggunakan varian quicksort. Saya dulu membuat algoritma 50% lebih cepat dengan mengganti std::sort()dengan jenis radix yang tidak stabil. Saya tidak yakin apa itu "versi memori yang dioptimalkan" dari quicksort, tapi saya ragu ini bisa dua kali lebih cepat dari versi STL.

Posting blog ini mengevaluasi jenis radix bersama dengan beberapa algoritma pengurutan lainnya. Secara singkat, dalam evaluasi ini, std::sort()dibutuhkan 5,1 detik untuk mengurutkan 50 juta bilangan bulat, sedangkan di-tempat / tidak stabil jenis radix membutuhkan waktu 2,0 detik. Jenis radix yang stabil harus lebih cepat.

Radix sort juga banyak digunakan untuk string sorting yang stabil. Varian jenis radix kadang-kadang terlihat untuk membangun susunan sufiks, BWT, dll.

pengguna172818
sumber