В книге "Введение в алгоритмы" упоминается версия поразрядной сортировки LSD (наименее значащая цифра). Однако, как указывали другие здесь в stackoverflow, также существует версия MSD (самая значащая цифра). Поэтому я хочу знать плюсы и минусы каждого из них. Я предполагаю, что версия LSD имеет некоторые преимущества перед версией MSD, но я не уверен. Отсюда вопрос.
Сортировка по основанию: версии LSD и MSD
Ответы (3)
Взято из ссылки, может быть полезно: http://www.eternallyconfuzzled.com/tuts/algorithms/jsw_tut_sorting.aspx (в самом низу)
Самая большая проблема с сортировкой по основанию LSD заключается в том, что она начинается с цифр, которые имеют наименьшее значение. Если бы мы могли начать с самых значащих цифр, первый проход позволил бы отсортировать весь диапазон, а каждый последующий проход просто обрабатывал бы детали. Идея сортировки по основанию MSD состоит в том, чтобы разделить все цифры с одинаковым значением на их собственное ведро, а затем сделать то же самое со всеми ведрами, пока массив не будет отсортирован. Естественно, это предполагает рекурсивный алгоритм, но это также означает, что теперь мы можем сортировать элементы переменной длины и нам не нужно трогать все цифры, чтобы получить отсортированный массив. Это делает поразрядную сортировку MSD значительно быстрее и полезнее.
Как написано в книге Алгоритмы, LSD и MSD являются алгоритмами сортировки строковых массивов, основанными на так называемый ключевой индексированный подсчет, а не сравнения. Следовательно, LSD и MSD имеют разное время работы по сравнению с традиционной быстрой сортировкой или сортировкой слиянием.
Как упомянул Джабаров, самая большая разница между LSD и MSD заключается в том, что MSD сначала рассматривает наиболее значащую цифру или символ, что по своей природе сортирует строки без повторения всех цифр в строках. Это преимущество. Однако рекурсивная реализация MSD использует больше места, чем LSD.
В таблице ниже показаны части различий между быстрой сортировкой, LSD и MSD.
algorithm running time extra space
quicksort N(lgN)^2 1
LSD NW N
MSD between N and NW N + WR
где N — длина массива, W — длина строки, а R — размер системы счисления.
PS: как упоминалось в книге, системная сортировка Java использует общий алгоритм сортировки с быстрым сравнением строк, а не LSD или MSD.
LSD быстрее, чем MSD, когда есть фиксированная длина. MSD слишком медленный для небольших файлов и требует огромного количества рекурсивных вызовов для небольших файлов.