Чому Radix Sort ?


23

У сортуванні radix ми спочатку сортуємо за найменш значущою цифрою, потім сортуємо за другою найменш значущою цифрою тощо, і закінчуємо сортованим списком.

Тепер, якщо у нас є список з чисел, нам потрібно розрядів, щоб розрізняти це число. Так кількість поразрядной сортування проходить ми робимо буде . Кожен прохід займає час, а значить, час роботи сортування radix становитьlog n log nnlognlognO ( n log n )O(n)O(nlogn)

Але добре відомо, що це лінійний алгоритм часу. Чому?


Ось чому зазвичай лінійні сорти часу вимагають, щоб вхід був цілими числами за деякий фіксований діапазон. Для сортування Radix потрібен фіксований діапазон цифр. У вашому прикладі ви припускали, що діапазон був , але будь-який цілий діапазон можливий для цифр; наприклад, ви могли обрати[ 0 , [0,1][0,n]
Джо

Відповіді:


19

якщо у нас є список з чисел, нам потрібно бітівжурнал nnlogn

Ні: якщо у нас є список чисел від до , нам потрібно біт. Немає взаємин між і загалом.2 k - 1 k k log n02k1kklogn

Якщо цифри всі виразні, то , і сортування radix на окремі числа, отже, має складність у часі . Загалом, складність сортування радіокси є де - кількість елементів для сортування, а - кількість бітів у кожному елементі.Ω ( n log n ) Θ ( nlognkΩ(nlogn)п кΘ(nk)nk

Сказати, що складність сортування radix дорівнює означає прийняття фіксованого розміру бітів для чисел. Це означає, що для досить великого буде багато повторюваних значень.nO(n)n


Існує загальна теорема про те, що метод сортування масиву чи списку, який працює, порівнюючи два елементи за один раз, не може працювати у швидшому випадку, ніж . Сортування Radix не працює, порівнюючи елементи, але працює той самий метод підтвердження. Сортування Radix - це процес прийняття рішення для визначення, яку перестановку застосувати до масиву; єперестановки масиву і сортування radix приймають бінарні рішення, тобто він вирішує, замінювати два елементи чи ні на кожному етапі. Після бінарних рішень сортировка radix може визначати перестановки . Щоб досягтиможливі перестановки, необхідно, щоб .n ! м 2 м н ! m log ( n ! ) = Θ ( n log n )Θ(nlogn)n!m2mn!mlog(n!)=Θ(nlogn)

Припущення в доказі того, що я не писав вище, полягає в тому, що алгоритм повинен працювати в тому випадку, коли елементи відрізняються. Якщо апріорі відомо, що елементи не всі виразні, то кількість потенційних перестановок менше повного. При сортуванні -бітових чисел можливе лише різних елементів, коли ; у цьому випадку складність сортування радіасів дійсно є . Для більших значень повинні бути зіткнення, що пояснює, як сортування радіокси може мати складність, меншу ніж коли .k n n 2 k Ω ( n log n ) n Θ ( n log n ) n > 2 kn!knn2kΩ(nlogn)nΘ(nlogn)n>2k


1
Альтернативною точкою зору є модель вартості слова RAM: наша машина може працювати з цілими числами біт у постійному часі. (Поточні машини, що мають ) Таким чином, один крок сортування з відрами можна зробити за час, безпосередньо звернувшись до відповідного елемента масиву. Таким чином, сортування radix є лінійним для цілих чисел бітів кожне. w = 64 2 w O ( 1 ) n w = O ( log n )ww=642wO(1)nw=O(logn)
Себастьян

9

Будьте обережні зі своїм аналізом: як ви вважаєте, щоб зробити сортування за час? Це відбувається тому, що кожна ваша цифра знаходиться в діапазоні від до , тобто ваші цифри можуть приймати можливих значень. Вам потрібен стабільний алгоритм сортування, так що ви можете, наприклад, вибрати сортування підрахунку. Підрахунок сортування працює в час. Якщо , підрахунок сортування працює за лінійним часом.0 k - 1 k Θ ( n + k ) k = O ( n )O(n)0k1kΘ(n+k)k=O(n)

У кожному з ваших рядків чи чисел є -знаки. Як ви кажете, ви робите проходи над ними. Отже, сортування radix чітко працює за . Але якщо ми вважаємо постійним і , ми бачимо, що сортувальний радіус працює в лінійний час.d Θ ( d ( n + k ) ) d k = O ( n )ddΘ(d(n+k))dk=O(n)


1
Наприклад, припустимо, що ви сортуєте цілі числа в діапазоні для деяких для постійної . Тоді ви можете мати цифри з діапазоном . N = O ( n d ) d O ( d ) O ( n )[0,N1]N=O(nd)dO(d)O(n)
Джо

-2

Я думаю, припущення неправильне. Ви можете виконати сортування в радіаційному режимі з числами, наприклад, у шістнадцяткові. Таким чином, на кожному кроці ви розділяєте масив чисел на відер.16k=log2(n)16


6
Що стосується big-O, то різниці між та . log 16 nlog2nlog16n
Рік Декер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.