Radix Sort


23

Sayı tabanı sıralamasında önce en az anlamlı basamağa göre sıralarız, daha sonra ikinci en az önemli basamağa göre sıralarız ve böylece sıralı listeyle sonuçlanırız.

Şimdi n numaralar listemiz varsa , bu sayıları ayırt etmek için logn bitlerine ihtiyacımız var . Radix sayısı sıralama geçer yüzden olacak yapmak logn . Her geçiş O(n) zaman alır ve bu nedenle sayı tabanı sıralamasının çalışma süresi O(nlogn)

Ancak bunun doğrusal zaman algoritması olduğu iyi bilinmektedir. Niye ya?


Bu nedenle doğrusal zaman türleri genellikle girdinin belirli bir sabit aralıkta tamsayı olmasını gerektirir. Radix sıralaması basamaklarda sabit bir aralık gerektirir. Örneğinizde, aralığın olduğunu varsaydınız , ancak basamaklar için herhangi bir tamsayı aralığı mümkündür; örneğin, [ 0 , [0,1][0,n]
Joe

Yanıtlar:


19

numaralar listemiz varsa log n bit'e ihtiyacımız varnlogn

Hayır: ile 2 k - 1 arasında bir sayı listemiz varsa , k bitlerine ihtiyacımız vardır . Genel olarak k ve log n arasında bir ilişki yoktur .02k1kklogn

Sayıların hepsi farklıysa, ve farklı sayılardaki sayı tabanı sıralaması Ω ( n log n ) zaman karmaşıklığına sahiptir . Genel olarak, sayı tabanı sıralamasının karmaşıklığı Θ ( nlognkΩ(nlogn) burada n , sıralanacak öğelerin sayısı ve k , her öğedeki bitlerin sayısıdır.Θ(nk)nk

Sayı tabanı sıralamasının karmaşıklığının olduğunu söylemek , sayılar için sabit bir bit boyutu almak anlamına gelir. Bu, yeterince büyük n için birçok yinelenen değer olacağı anlamına gelir .O(n)n


Aynı anda iki öğeyi karşılaştırarak çalışan bir dizi veya liste sıralama yönteminin Θ ( n günlüğünden daha hızlı çalışamayacağına dair genel bir teorem vardır.en kötü durumda n ). Radix sıralama, öğeleri karşılaştırarak çalışmaz, ancak aynı kanıt yöntemi de çalışır. Radix sıralama, diziye hangi permütasyonun uygulanacağını belirleyen bir karar sürecidir; orada n ! dizinin permütasyonları ve sayı tabanı sıralaması ikili kararlar alır, yani her aşamada iki elemanın değiştirilip değiştirilmeyeceğine karar verir. Sonra m ikili kararlar, basamağa göre sıralama arasında karar verebilir 2 m permütasyon. N ulaşmak için ! olası permütasyonlar,Θ(nlogn)n!m2mn! .mlog(n!)=Θ(nlogn)

Yukarıda yazmadım kanıtında bir varsayım, algoritmanın elemanların farklı olduğu durumda çalışması gerektiğidir. Elemanların hepsinin farklı olmadığı bir önsezi biliniyorsa, potansiyel permütasyon sayısı tam azdır ! . Sıralarken k bitlik sayılar, şey var mümkündür n farklı eleman n n!kn ; bu durumda, sayı tabanı sıralamasının karmaşıklığı gerçekten Ω ( n log n ) olur . Büyük değerleri için n , hangi basamağa göre sıralama az olan bir karmaşıklık olabilir açıklar, çarpışmalar olmalı İçeride ISTV melerin RWMAIWi'nin (n2kΩ(nlogn)nn > 2 k .Θ(nlogn)n>2k


1
Alternatif bir bakış açısı, kelime-RAM maliyet modelinin bakış açısıdır: Makinemiz sabit zamanda bit tamsayılarıyla çalışabilir . ( W = 64 olan mevcut makineler .) Bu şekilde, 2 w kovalara sahip bir dağıtım adımı, ilgili bir dizi elemanına doğrudan erişilerek O ( 1 ) zamanında yapılabilir . Bu şekilde, sayı tabanı her biri w = O ( log n ) bitlerinin n tamsayıları için doğrusaldır . ww=642wO(1)nw=O(logn)
Sebastian

9

Analizinize dikkat edin: zamanında sıralama yapmayı neyin bekliyorsunuz ? Bunun nedeni, rakamlarınızın her birinin 0 ile k - 1 arasında olması , yani rakamlarınızın k olası değerlerini alabileceği anlamına gelir . İstikrarlı bir sıralama algoritmasına ihtiyacınız vardır, böylece örneğin sayma sıralamasını seçebilirsiniz. Sayım sıralama sayısı Θ ( n + k )O(n)0k1kΘ(n+k) süresinde çalışır. Eğer doğrusal zamanda, sayma sıralama çalışır.k=O(n)

Dizelerinizin veya sayılarınızın her birinin basamakları vardır. Söylediğiniz gibi, üzerlerine d geçişi yapıyorsunuz . Bu nedenle, sayı tabanı sıralaması açıkça Θ ( d ( n + k ) ) zamanda çalışır. Ancak d' nin sabit ve k = O ( n ) olduğunu düşünürsek, sayı tabanı sıralamasının doğrusal zamanda çalıştığını görürüz.ddΘ(d(n+k))dk=O(n)


1
Örneğin, sabit d için bazı N = O ( n d ) için aralığında tamsayıları sıraladığınızı varsayalım . Sonra her biri O ( n ) aralığına sahip O ( d ) basamaklarına sahip olabilirsiniz . [0,N1]N=O(nd)dO(d)O(n)
Joe

-2

Bence varsayımı yanlış. Rakamlarla sayılarla sayı tabanı sıralaması yapabilirsiniz, örn. Hex. Böylece, her adımda size sayı dizisinik=log2(n)ayırırsınız.16


6
Big-O söz konusu olduğunda, ve log 16 n arasında bir fark yoktur . log2nlog16n
Rick Decker
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.