Mengapa Radix Sort ?

23

Dalam radix sort, pertama-tama kita urutkan berdasarkan digit paling tidak signifikan, lalu kita urutkan berdasarkan digit paling sedikit kedua dan seterusnya dan berakhir dengan daftar yang diurutkan.

Sekarang jika kita memiliki daftar nomor kita perlu bit untuk membedakan antara angka-angka itu. Jadi jumlah lintasan sortir radix yang kita buat adalah . Setiap pass membutuhkan waktu dan karenanya waktu berjalan dari jenis radix adalahlog n log n O ( n ) O ( n log n )nlognlognO(n)O(nlogn)

Tetapi diketahui bahwa itu adalah algoritma waktu linier. Mengapa?

Pratik Deoghare
sumber
Inilah sebabnya mengapa jenis waktu linear biasanya mengharuskan input menjadi bilangan bulat pada beberapa rentang tetap. Urutan Radix membutuhkan rentang tetap pada digit. Dalam contoh Anda, Anda mengasumsikan rentang adalah , tetapi rentang integer apa pun dimungkinkan untuk digit; misalnya, Anda dapat memilih[ 0 , [0,1][0,n]
Joe

Jawaban:

19

jika kita memiliki daftar nomor kita perlu bitlog nnlogn

Tidak: jika kita memiliki daftar angka antara dan , kita perlu bit. Tidak ada hubungan antara dan secara umum.2 k - 1 k k log n02k1kklogn

Jika angkanya berbeda, maka , dan radix sort pada angka yang berbeda karena itu memiliki kompleksitas waktu . Secara umum, kompleksitas sortir radix adalah mana adalah jumlah elemen untuk disortir dan adalah jumlah bit dalam setiap elemen.Ω ( n log n ) Θ ( nlognkΩ(nlogn)n kΘ(nk)nk

Mengatakan bahwa kompleksitas jenis radix adalah berarti mengambil ukuran bit yang tetap untuk angka-angkanya. Ini menyiratkan bahwa untuk cukup besar , akan ada banyak nilai duplikat.nO(n)n


Ada teorema umum bahwa metode pengurutan larik atau daftar yang berfungsi dengan membandingkan dua elemen sekaligus tidak dapat berjalan lebih cepat dari dalam kasus terburuk. Urutan Radix tidak bekerja dengan membandingkan elemen, tetapi metode bukti yang sama berfungsi. Sortir radix adalah proses pengambilan keputusan untuk menentukan permutasi yang diterapkan pada array; adapermutasi array, dan radix sort mengambil keputusan biner, yaitu memutuskan apakah akan menukar dua elemen atau tidak pada setiap tahap. Setelah keputusan biner, radix sort dapat memutuskan antara permutasi. Untuk mencapaikemungkinan permutasi, perlu bahwa .n ! m 2 m n ! m log ( n ! ) = Θ ( n log n )Θ(nlogn)n!m2mn!mlog(n!)=Θ(nlogn)

Asumsi dalam bukti bahwa saya tidak menulis di atas adalah bahwa algoritma harus bekerja dalam kasus ketika elemen berbeda. Jika diketahui apriori bahwa unsur-unsurnya tidak semuanya berbeda, maka jumlah permutasi potensial kurang dari penuh. Saat mengurutkan angka -bit, hanya mungkin untuk memiliki elemen yang berbeda ketika ; dalam hal ini, kompleksitas jenis radix memang . Untuk nilai lebih besar , harus ada tabrakan, yang menjelaskan bagaimana radix sort dapat memiliki kompleksitas yang kurang dari ketika .k n n 2 k Ω ( n log n ) n Θ ( n log n ) n > 2 kn!knn2kΩ(nlogn)nΘ(nlogn)n>2k

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Sudut pandang alternatif adalah model biaya kata-RAM: Mesin kami dapat bekerja dengan bilangan bulat dalam waktu yang konstan. (Mesin saat ini memiliki ) Dengan begitu, satu langkah pengurutan distribusi dengan ember dapat dilakukan dalam waktu dengan secara langsung mengakses elemen array yang sesuai. Dengan begitu, radix sort adalah linier untuk bilangan bulat dari masing-masing. ww=642wO(1)nw=O(logn)
Sebastian
9

Berhati-hatilah dengan analisis Anda: apa yang Anda asumsikan untuk membuat penyortiran berjalan dalam waktu ? Ini karena setiap digit Anda berada dalam kisaran dari hingga , yang berarti digit Anda dapat mengambil nilai mungkin. Anda memerlukan algoritme penyortiran yang stabil, jadi Anda dapat misalnya memilih penghitungan sortir. Menghitung sorting berjalan dalam waktu . Jika k = O ( n ) , penghitungan sort berjalan dalam waktu linier.O(n)0k1kΘ(n+k)k=O(n)

Setiap string atau angka Anda memiliki digit. Seperti yang Anda katakan, Anda membuat d melewati mereka. Karenanya, jenis radix jelas berjalan dalam waktu Θ ( d ( n + k ) ) . Tetapi jika kita menganggap sebagai konstan dan , kita melihat bahwa radix sort berjalan dalam waktu linier.ddΘ(d(n+k))dk=O(n)

Juho
sumber
1
Sebagai contoh, anggaplah Anda menyortir bilangan bulat dalam kisaran untuk beberapa N = O ( n d ) untuk konstanta d . Kemudian Anda dapat memiliki O ( d ) digit masing-masing dengan rentang O ( n ) . [0,N1]N=O(nd)dO(d)O(n)
Joe
-2

Saya pikir anggapan salah. Anda dapat melakukan radix sort dengan angka di, misalnya, hex. Jadi, pada setiap langkah Anda membagi array angka menjadi 16 ember.k=log2(n)16

Alexandre Kandalintsev
sumber
6
Sejauh menyangkut O besar, tidak ada perbedaan antara dan log 16 n . log2nlog16n
Rick Decker