Я читаю введение в алгоритмы 2-го издания, и есть вопрос о том, что мы можем отсортировать n целых чисел, которые находятся между 0 и n3-1 за линейное время. Я думаю о подходе сортировки IBM по основанию. Я начинаю с младшей значащей цифры, разделяю числа по младшей значащей цифре, а затем сортирую, затем разделяю по следующей младшей значащей цифре и так далее. Каждое разделение занимает O(n) времени. Но у меня есть сомнения, например, если одно из чисел состоит из n цифр, то алгоритм принимает O(1*n+2*n+...+n*n)=O(n2 суп>) время, да? Можем ли мы гарантировать, что числа состоят менее чем из n цифр, или кто-нибудь может дать другую подсказку по этому вопросу? Спасибо
Сортировка в линейном времени
Ответы (2)
Сложность сортировки по основанию равна O(dn)
, где d
— количество цифр в числе.
Алгоритм работает за линейное время только тогда, когда d
является постоянным! В вашем случае d = 3log(n)
и ваш алгоритм будет работать в O(nlog(n))
.
Честно говоря, я не уверен, как решить эту проблему за линейное время. Есть ли какая-либо другая информация о природе чисел? Мне интересно, отсутствует ли какая-либо другая информация о природе чисел...
n**3-1
требует 3 цифры в базе n
. 2. Вы не можете ожидать, что манипулирование цифрой в базе n
будет O(1) (постоянное время) для произвольно большого n
.
- person jfs; 11.03.2013
n
умещается в O (1) слов, тогда манипулирование цифрой в базе n
будет O (1), а для ограничения n**3
проблема может быть решена за время O (n).
- person jfs; 11.03.2013
n
(элементов) и d
(ключей). Параметры d
и n
обычно независимы, а d
постоянны и, желательно, малы. Точно так же сложность графовых алгоритмов, например, зависит от G
и V
. В этом случае d
является функцией n
и, таким образом, у нас есть время работы O(nlog(n))
, что в этом не так?
- person Marsellus Wallace; 16.03.2013
O(dn)
(он сортирует n элементов d раз). С d=3log(n)
(в базе 10, учитывая, что максимальное число равно n^3 - 1
), тогда время работы равно O(nlog(n))
(большой-O, а не тета).
- person Marsellus Wallace; 17.03.2013
Предполагая модель ОЗУ слов и то, что n помещается в O (1) слов, существует алгоритм линейного времени.
Запишите каждое число в базе n и выполните сортировку по основанию (со стабильной версией сортировки подсчетом в качестве базовой сортировки цифр).
Если вы хотите предположить неограниченное n, то размер входных данных на самом деле n log n, и в этом случае сортировка по основанию снова работает (за время O (n log n)), и с технической точки зрения это все еще алгоритм с линейным временем! (Конечно, я полагаю, что это все еще предполагает, что арифметика равна O (1)...)
linearithmic
на самом деле linear
?
- person Marsellus Wallace; 16.03.2013
O(nlog(n))
, но если вы примете это как линейное решение, проблема будет тривиально решена с хорошей реализацией QuickSort, MergeSort или других...
- person Marsellus Wallace; 17.03.2013