Опубликован: 05.01.2015 | Доступ: свободный | Студентов: 2178 / 0 | Длительность: 63:16:00
Лекция 10:

Поразрядная сортировка

Характеристики производительности поразрядных сортировок

Время выполнения LSD-сортировки при упорядочении N записей с ключами, состоящими из w байтов, пропорционально Nw, поскольку алгоритм совершает w проходов по всем N ключам. Как показано на рис.10.17, это свойство не зависит от характера входных данных.

Для случая длинных ключей и коротких байтов это время сравнимо с Nlg N: например, если бинарная LSD-сортировка используется для сортировки 1 миллиарда 32-разрядных ключей, то и w, и lg N примерно равны 32. Для более коротких ключей и более длинных байтов время выполнения сравнимо с N: например, если 64-разрядные ключи рассматриваются по 16-разрядному основанию системы счисления, то w равно небольшой константе — 4.

 Динамические характеристики поразрядной LSD-сортировки для различных видов файлов

Рис. 10.17. Динамические характеристики поразрядной LSD-сортировки для различных видов файлов

На данных диаграммах представлены этапы LSD-сортировки для файлов с 200 записями: случайных с равномерным распределением, случайных с нормальным распределением, почти упорядоченных, почти обратно упорядоченных и случайно упорядоченных с 10 различными ключами (слева направо). Время выполнения не зависит от исходного порядка входных данных. Три файла с одним и тем же набором ключей (первый, третий и четвертый файлы — перестановки целых чисел от 1 до 200) имеют на завершающих этапах сортировки похожий вид.

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

Лемма 10.1. В худшем случае поразрядная сортировка выполняет проверку всех байтов во всех ключах.

Другими словами, различные виды поразрядной сортировки являются линейными в том смысле, что затрачиваемое время не более чем пропорционально количеству цифр во входных данных. Это утверждение непосредственно следует из анализа программ: ни одна из цифр не проверяется дважды. Для всех рассмотренных программ худшим случаем является ситуация, когда все ключи одинаковы. $\blacksquare$

Как мы уже видели, для случайных ключей и во многих других ситуациях время выполнения MSD-сортировки может быть сублинейным по отношению к общему числу битов данных, поскольку не обязательно выполнять полный просмотр ключей. Для ключей произвольной длины справедливо следующее утверждение:

Лемма 10.2. При сортировке ключей, состоящих из случайных битов, бинарная быстрая сортировка в среднем проверяет Nlg N разрядов.

Если размер файла равен степени 2, а биты принимают случайные значения, то можно ожидать, что одна половина старших битов равна 0, а другая половина — 1, поэтому, как и в случае быстрой сортировки в "Быстрая сортировка" , данная ситуация описывается рекуррентным соотношением CN = 2CN/2 + N . Опять-таки, это описание ситуации недостаточно точно, поскольку точка разбиения попадает в середину файла только в среднем (и поскольку количество битов в ключе конечно). Однако для бинарной быстрой сортировки вероятность попадания точки разбиения в окрестность центра выше, чем для стандартной быстрой сортировки, поэтому старший член выражения, определяющего время выполнения сортировки, тот же, что и для идеальных разбиений. Подробный анализ, доказывающий этот результат, впервые выполнен Кнутом в 1973 г. и представляет собой классический пример анализа алгоритмов (см. раздел ссылок). $\blacksquare$

Этот результат обобщается и на случай MSD-сортировки. Но поскольку основной интерес для нас представляет полное время выполнения сортировки, а не количество просмотренных символов, нужно проявлять осторожность, т.к. время выполнения поразрядной сортировки пропорционально величине основания системы счисления R и не зависит от ключей.

Лемма 10.3. MSD-сортировка с основанием системы счисления R требует выполнения по меньшей мере 2N + 2R шагов для упорядочения файла размером N.

MSD-сортировка требует выполнения по меньшей мере одного прохода распределяющего подсчета, а распределяющий подсчет состоит из не менее двух проходов по записям (один для подсчета, другой для распределения) — это минимум 2N шагов, и еще двух проходов по счетчикам (один для их обнуления в начале, а другой для определения концов подфайлов) — еще минимум 2R шагов.$\blacksquare$

Данное свойство выглядит тривиальным, но оно играет весьма важную роль в понимании MSD-сортировки. В частности, из него следует, что нельзя утверждать, что время выполнения сортировки снижается при уменьшении N, поскольку R может быть намного больше, чем N. Короче говоря, для сортировки небольших файлов следует использовать другие методы. Этот вывод является решением проблемы пустых контейнеров, которая была рассмотрена в конце раздела 10.3. Например, если R равно 256, а N равно 2, то MSD-сортировка будет в 128 раз медленнее, чем более простой метод с обычным сравнением элементов. Рекурсивная структура MSD-сортировки приводит к тому, что рекурсивная программа будет многократно вызывать себя для большого количества небольших файлов. Поэтому игнорирование проблемы пустых контейнеров в рассматриваемом примере может привести к замедлению всей поразрядной сортировки в 128 раз. Что касается промежуточных ситуаций (например, если R равно 256, а N равно 64), то затраты будут не столь катастрофичными, но все же существенными. Использовать сортировку вставками не стоит, поскольку ее N2/4 сравнений — это слишком медленно; игнорировать проблему пустых контейнеров не стоит, поскольку их очень много. Простейший путь решения этой проблемы состоит в использовании основания системы счисления, которое меньше размера сортируемого файла.

Лемма 10.4. Если основание системы счисления всегда меньше размера файла, то число шагов, выполняемых MSD-сортировкой, равно в среднем N logRN с небольшим постоянным множителем (для ключей, состоящих из случайных байтов), а в худшем случае — количеству байтов в ключе с небольшим постоянным множителем.

Результат для худшего случая непосредственно следует из предыдущих рассуждений, а оценка для среднего случая следует из обобщения анализа, выполненного для леммы 10.2. При больших R множитель logRN мал, поэтому для практических целей можно считать, что общее время пропорционально N. Например, если R = 216, то logRN меньше 3 для всех N < 248 , что охватывает все практически возможные размеры файлов. $\blacksquare$

Как и лемма 10.2, лемма 10.4 позволяет сделать важный для практических приложений вывод о том, что MSD-сортировка случайных ключей достаточно большой длины фактически является сублинейной функцией от общего количества разрядов в ключах. Например, при сортировке 1 миллиона 64-разрядных случайных ключей потребуется проверка 20—30 старших разрядов ключей, т.е. менее половины всех данных.

Лемма 10.5. При упорядочении N ключей (произвольной длины) трехпутевая поразрядная быстрая сортировка выполняет в среднем 2N lnN сравнений байтов.

Возможны два поучительных толкования этого результата. Во-первых, если считать рассматриваемый метод эквивалентным разбиению быстрой сортировкой по старшему разряду, и затем (рекурсивному) использованию этого метода к полученным подфайлам, то неудивительно, что общее число операций примерно такое же, как и в случае нормальной быстрой сортировки — но это сравнения отдельных байтов, а не полных ключей. Во вторых, рассматривая этот метод с точки зрения, показанной на рис. 10.13, можно ожидать, что время выполнения NlogRN из свойства 10.3 следует умножить на 2 lnR, поскольку для упорядочения R байтов требуется 2R lnR шагов быстрой сортировки — в отличие от R шагов для тех же байтов в trie-дереве. Полное доказательство мы опускаем (см. раздел ссылок). $\blacksquare$

Лемма 10.6. LSD—сортировка может упорядочить N записей с w-разрядными ключами за w / lg R проходов, используя дополнительную память для R счетчиков (и буфера для переупорядочения файла).

Доказательство этого факта непосредственно вытекает из реализации. В частности, если взять R = 2w/4 , получится четырехпроходная линейная сортировка. $\blacksquare$

Упражнения

10.39. Предположим, что входной файл состоит из 1000 копий каждого из чисел от 1 до 1000, каждое в виде 32-разрядного слова. Опишите, как воспользоваться этими сведениями, чтобы получить быстрый вариант поразрядной сортировки.

10.40. Предположим, что входной файл состоит из 1000 копий каждого из тысячи различных 32-разрядных чисел. Опишите, как воспользоваться этими сведениями, чтобы получить быстрый вариант поразрядной сортировки.

10.41. Каково общее количество байтов, проверяемых в худшем случае трехпутевой поразрядной быстрой сортировкой при упорядочении строк байтов фиксированной длины?

10.42. Эмпирически сравните количество байтов, проверяемых трехпутевой поразрядной быстрой сортировкой при упорядочении длинных строк для N = 103, 104, 105 и 106 , с количеством сравнений в случае стандартной быстрой сортировки тех же файлов.

о 10.43. Приведите количество байтов, проверяемых при выполнении MSD-сортировки и трехпутевой поразрядной быстрой сортировки для файла с N ключами А, АА, ААА, АААА, ААААА, АААААА, ... .

Бактыгуль Асаинова
Бактыгуль Асаинова

Здравствуйте прошла курсы на тему Алгоритмы С++. Но не пришел сертификат и не доступен.Где и как можно его скаачат?

Александра Боброва
Александра Боброва

Я прошла все лекции на 100%.

Но в https://www.intuit.ru/intuituser/study/diplomas ничего нет.

Что делать? Как получить сертификат?