Практичні програми сортування Radix


20

Теоретично сортування Radix дуже швидко, коли ви знаєте, що ключі знаходяться у певному обмеженому діапазоні, скажімо, наприклад, значень у діапазоні . Якщо ви просто конвертуєте значення в базу яка займає час, зробіть базу radix сортування, а потім перетворіть назад у початкову базу для загального алгоритму .н[0нк-1]к<lgннΘ(н)нΘ(нк)

Однак я читав, що на практиці сортування в радіаційному режимі зазвичай набагато повільніше, ніж робити, наприклад, рандомізований квартер :

Для великих масивів сортування radix має найменший кількість інструкцій, але через відносно низьку продуктивність кешу його загальна продуктивність гірша, ніж оптимізовані для пам’яті версії злиття та швидкості.

Чи є сорт radix лише приємним теоретичним алгоритмом, чи він має спільне практичне використання?

Відповіді:


15

На практиці сорти Radix часто є найшвидшими та найкориснішими видами на паралельних машинах.

На кожному вузлі мультипроцесора ви, ймовірно, робите щось на кшталт швидкодіючого косого, але радіоскопічне сортування дозволяє багатьом вузлам працювати разом із меншою синхронізацією, ніж різні рекурсивні сорти.

Бувають і інші ситуації. Якщо вам потрібен стабільний сорт (сорт, коли дві клавіші рівні, вони залишаються в одному порядку, а не переставляються), я не знаю жодної версії quicksort, яка буде корисною. Mergesort також стабільний (якщо його правильно здійснити). Ваше посилання вперше я чую, щоб хтось говорив, що злиття може бути зроблено для кращого кеш-поведінки, ніж радіо-сортування.


Паттерсон і Хеннесі говорять про те, що Ламарка говорив вище, у своїй книзі «Організація та дизайн комп'ютерів».
Роберт С. Барнс

Ваша згадка про Паттерсона нагадала мені важливу роботу, яку Андреа Арпачі-Дюссо робив над сортуванням у кластерах близько 15 років тому. (Паттерсон був співавтором). У документі 1997 року вони фактично вирішили, що сортування з частковим радіусом є переважним, а також для швидкого розбору на окремих вузлах. (Я додав посилання на відповідь).
Мандрівна логіка

Це цікаво. У четвертій редакції CompOrg 2009 року вони посилаються на роботу Ламарки про попередні версії сорту Radix, які не керуються кешем (стор. 489), але потім на сторінці 490 під графами, що порівнюють сорти Quicksort і Radix, вони кажуть: "Завдяки таким результатам з'являються нові версії Створено сорт Radix, який враховує ієрархію пам’яті, щоб повернути її алгоритмічні переваги ». Мені цікаво, як працюють ці нові версії Radix Sort.
Роберт С. Барнс

Я підозрюю, що Ламарка просто використовував дурний сорт радикалу (той, який зберігає свої відра як пов'язані списки.) Ніхто цього не зробив. Ви б реалізували відра, використовуючи якийсь оптимізований динамічний масив (наприклад, як C ++ vector). Але я не знаю, як не читав папери Ламарки.
Мандрівна логіка

@WanderingLogic, де сортуючий радікс використовує відра? Ви маєте на увазі тут сортування відра?
Бар

3

@Robert: Ваше посилання є досить дивовижним (насправді я не зміг знайти запропоноване речення). Мій особистий досвід полягає у випадковому введенні, сортування radix набагато швидше, ніж STL std::sort(), де використовується варіант швидкості. Я використовував алгоритм на 50% швидше, замінюючи std::sort()нестабільний сорт радіації. Я не впевнений, що таке "оптимізована пам'ять версія" quicksort, але я сумніваюся, що вона може бути вдвічі швидшою, ніж версія STL.

У цій публікації блогу було оцінено сортування радіації разом із кількома іншими алгоритмами сортування. Якщо коротко, в цій оцінці std::sort()потрібно 5,1 сек для сортування 50 мільйонів цілих чисел, тоді як на місці / нестабільному сортуванні радіації йде 2,0 сек. Стабільний сорт радіасу повинен бути ще швидшим.

Сорт Radix також широко використовується для стабільного сортування рядків. Варіанти сортування radix час від часу видно для побудови масивів суфіксів, BWT тощо.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.