Arama ve sıralama · 17 / 53
Counting, radix ve bucket sort
Anla → iz sür → uygula → gerekçelendir
2 dk okuma · uygulama için ayrıca zaman ayırKarşılaştırma tabanlı sıralama karar ağacı n! olası permütasyonu ayırmalıdır; worst-case Ω(n log n) karşılaştırma alt sınırı buradan gelir. Counting sort bu modeli değiştirdiği için sınırı ihlal etmez: anahtarları sınırlı tamsayı aralığına indeksler.
Counting sort frekans sayıp prefix konumlarıyla kayıtları yerleştirir. Basit değer çoğaltma sürümü tam kayıtların stabilitesini göstermez. LSD radix sort en düşük anlamlı basamaktan başlayıp her basamakta stabil bir sıralama yapar. Stabilite olmazsa önceki basamak düzeni kaybolur. Negatif sayılar, değişken uzunluk ve Unicode collation için dönüşüm/sözleşme gerekir.
Bucket sort aralığı bölgelere ayırır; iyi dağılımda hızlı olabilir ama bütün girdinin tek bucket'a düşmesi performansı bozar. Anahtar aralığı çok büyükken k boyutlu counting tamponu ayırmak kötü tercihtir. n küçük, k milyarlar ise n log n sıralama daha pratik olabilir.
Adım adım iz sürme
[2,0,2,1] için count=[1,1,2]; çıktı [0,1,2,2]. k anahtar aralığının genişliğidir, farklı öğe sayısı değildir.
Maliyet ve varsayımlar
Counting O(n+k) zaman/alan; radix d basamak ve b radix için O(d(n+b)).
Çalıştırılabilir örnek
Python 3 ile çalıştır. Assert küçük bir örneği denetler; genel doğruluk ispatı değildir. Bazı ileri örnekler özellikle küçük model veya referans oracle'dır; tam üretim uygulaması değildir.
def counting_sort(a, k):
counts = [0]*k
for x in a:
if not 0 <= x < k: raise ValueError("out of range")
counts[x] += 1
return [x for x, count in enumerate(counts) for _ in range(count)]
assert counting_sort([2,0,2,1], 3) == [0,1,2,2]KAVRADIĞINI KONTROL ET
Sıra sende
Radix'te her basamağı selection sort ile sıralamak neden sorun olabilir?
Çözümün mantığını göster
Standart selection stabil değildir; eşit basamaklar için önceki basamak sırasını bozabilir. Stabil counting gibi bir aşama gerekir.
Bir adım ileri
- Örneği değiştirmeden önce girdi sözleşmesini ve invariantı yaz.
- Uygun olan boş, sınır, tekrar ve adversarial girdileri ekle. Basit bir oracle ile karşılaştır.
- Belirtilen modelde maliyeti çıkar; farklı girdi büyüklüklerini ölç ve farkları gerekçelendir.
Temel kaynaklar ve ders notları
Bu eğitimde özgün anlatım kullanıldı; aşağıdaki kaynaklar ispatlar ve ileri okumalar sunar. Bağlantılar daha geniş ders modülünü kapsayabilir.
MIT 6.006 · Introduction to Algorithms ↗Princeton · Algorithms, Sedgewick & Wayne ↗