Radix Sort'un Pratik Uygulamaları


20

Anahtarların belirli bir sınırlı aralıkta olduğunu bildiğinizde radix sıralaması teorik olarak çok hızlıdır, örneğin aralığındaki değerlerini söyleyin . Eğer sadece tabanına değerleri dönüştürmek hangi sürer zaman, bir temel yapmak sıralama ve daha sonra genel için orijinal üsse geri dönüştürmek radix algoritması.n[0...nk-1]k<lgnnΘ(n)nΘ(nk)

Ancak, pratikte sayı tabanı sıralamasının örneğin rastgele bir çabuk sıralama yapmaktan çok daha yavaş olduğunu okudum :

Büyük diziler için, sayı tabanı sıralaması en düşük komut sayımına sahiptir, ancak nispeten zayıf önbellek performansı nedeniyle, genel performansı, birleştirme ve hızlı sıralamanın bellek için optimize edilmiş sürümlerinden daha kötüdür.

Sayı tabanı sıralaması sadece güzel bir teorik algoritma mıdır, yoksa ortak pratik kullanımları var mı?

Yanıtlar:


15

Radix çeşitleri genellikle pratikte paralel makinelerdeki en hızlı ve en kullanışlı çeşitlerdir.

Çok işlemcili her düğümde muhtemelen hızlı sıralama gibi bir şey yaparsınız, ancak radix sıralama birden çok düğümün çeşitli özyinelemeli türlerden daha az senkronizasyonla birlikte çalışmasına izin verir.

Başka durumlar da var. Eğer bir ihtiyaç varsa istikrarlı tür sonra kullanım olacaktır quicksort herhangi bir sürümü farkında değilim (iki anahtar ne zaman onlar aynı sırayla kalmak yerine yeniden düzenlenerek elde eşit bir tür). Mergesort da kararlıdır (doğru şekilde uygulanırsa). Bağlantınız ilk defa, birleştirme işleminin sayı tabanı sıralamasından daha iyi önbellek davranışına sahip olabileceğini söylediğini duydum.


Patterson ve Hennessy, Lamarca'nın Bilgisayar Organizasyonu ve Tasarımı adlı kitabında yukarıdaki bağlantılı makaleyle aynı noktayı ortaya koyuyor.
Robert S. Barnes

Patterson'dan bahsetmeniz bana Andrea Arpaci-Dusseau'nun yaklaşık 15 yıl önce kümeler üzerinde sıralamada yaptığı önemli çalışmayı hatırlattı. (Patterson ortak yazardı). 1997 makalesinde, kısmi-yarıçap türünün, tek tek düğümlerde de hızlı sıralamaya tercih edilmesine karar verdiler. (Cevaba referansları ekledim).
Gezici Mantık

İlginç. CompOrg'un 2009 dördüncü baskısında Lamarca'nın Radix sıralamasının önceki sürümleri üzerindeki çalışmalarına düşmanca önbellek olarak başvuruyorlar (sayfa 489), ancak daha sonra sayfa 490'da Quicksort ve Radix sıralamalarını karşılaştıran grafikler altında, "Bu sonuçlardan dolayı, Algoritmik avantajlarını yeniden kazanmak için bellek hiyerarşisini dikkate alan radix sıralaması icat edildi. " Radix Sort'un bu yeni sürümlerinin nasıl çalıştığını merak ediyorum.
Robert S. Barnes

Benim şüphem, Lamarca'nın sadece aptal bir sayı tabanı kullandığı (kovalarını bağlantılı listeler olarak tutan bir tane) kullandığı. Hiç kimse bunu yapmazdı. Bir tür optimize edilmiş dinamik dizi (örneğin, bir C ++ gibi vector) kullanarak kovaları uygularsınız . Ama bilmiyorum, çünkü Lamarca'nın gazetelerini okumadım.
Gezici Mantık

@WanderingLogic sayı tabanı sıralaması bölümleri nerede kullanır? Burada kova sıralaması mı demek istediniz?
Bar

3

@Robert: Bağlantınız oldukça şaşırtıcı (aslında alıntılanan cümleyi bulamadım). Kişisel deneyimim rasgele girdi için, sayı tabanı sıralaması, bir çeşit hızlı sıralama std::sort()çeşidi kullanan STL'den çok daha hızlı. Bir algoritmayı std::sort()dengesiz bir radyus sıralamasıyla değiştirerek% 50 daha hızlı yapardım . Ben quicksort "bellek optimize versiyonu" nedir emin değilim, ama STL sürümü iki kat daha hızlı olabilir şüpheliyim.

Bu blog gönderisi , diğer birkaç sıralama algoritmasıyla birlikte sayı tabanı sıralamasını değerlendirdi. Kısaca, bu değerlendirmede std::sort()50 milyon tamsayıyı sıralamak 5.1 saniye alırken, yerinde / kararsız sayı tabanı sıralaması 2.0 saniye alır. Kararlı sayı tabanı sıralaması daha da hızlı olmalıdır.

Radix sıralama ayrıca dizeleri kararlı bir şekilde sıralamak için yaygın olarak kullanılır. Sayı tabanı sıralamaları, sonek dizileri, BWT, vb. Oluşturmak için zaman zaman görülür.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.