Почему сортировка radix имеет пространственную сложность O (k + n)?
рассмотрим массив с n числа, имеющие максимум k цифры (см. правка). Рассмотрим программу сортировки radix из здесь:
def radixsort( aList ):
RADIX = 10
maxLength = False
tmp, placement = -1, 1
while not maxLength:
maxLength = True
# declare and initialize buckets
buckets = [list() for _ in range( RADIX )]
# split aList between lists
for i in aList:
tmp = i / placement
buckets[tmp % RADIX].append( i )
if maxLength and tmp > 0:
maxLength = False
# empty lists into aList array
a = 0
for b in range( RADIX ):
buck = buckets[b]
for i in buck:
aList[a] = i
a += 1
# move to next digit
placement *= RADIX
на buckets в основном это 2d-список всех чисел. Однако, только n значения будут добавлены к нему. Почему сложность пространства равна O(k + n), а не O(n)? Поправьте меня, если я ошибаюсь, даже если мы рассмотрим пространство, используемое для извлечения цифр в определенном месте, оно использует только 1 (постоянную) память космос?
редактировать: я хотел бы объяснить мое понимание k. Предположим, я дам ввод [12, 13, 65, 32, 789, 1, 3], алгоритм, приведенный в ссылке, будет проходить через 4 прохода (первого while петли внутри функции). Вот!--2--> = 4, т. е. максимальное. цифр для любого элемента массива + 1. Таким образом, к нет. пропусков. Это то же самое k участвует во временной сложности этого алгоритма:O(kn) в этом есть смысл. Я не могу понять, как он играет роль в космической сложности: O(k + n).
3 ответов
сложность пространства сортировки Radix привязана к сортировке, используемой для сортировки каждого radix. В лучшем случае это Счетная сортировка.
вот псевдокод, предоставленный CLRS для подсчета сортировки:
Counting-sort(A,B,k)
let C[0..k] be a new array
for i = 0 to k
C[i] = o
for j = 1 to A.length
C[A[j]] = C[A[j]] + 1
for i = 1 to k
C[i] = C[i] + C[i-1]
for j = A.length down to 1
B[C[A[j]]] = A[j]
C[A[j]] = C[A[j]] - 1
Как вы можете видеть, подсчет сортировки создает несколько массивов, один из которых основан на размере K, а другой-на размере N. B-выходной массив размером n. C-вспомогательный массив размера k.
поскольку сортировка radix использует сортировку подсчета, пространство сортировки подсчета сложность-это нижняя граница пространственной сложности radix sort.
я думаю, что есть терминологическая проблема. Космическая сложность реализации и реализации вопроса, упомянутого в ответ Джейсона Бубена is O(n+k). Но!--1--> не является длиной самого длинного слова (или самого длинного числа). k - это размер "алфавита": количество разных цифр (в цифрах) или букв (в словах).
buckets = [list() for _ in range( RADIX )]
этот код создает массив с RADIX элементы. В этом частности реализация RADIX является константой(а сложность пространства O (n)), но в целом это переменная. RADIX это k количество различных цифр (букв в алфавите). И это k не зависит от n и может быть больше, чем n в некоторых случаях сложность пространства равна O (n+k) в целом.
редактировать: In этой внедрение размере placement (или tmp) составляет O(k) (С вашим определением k), потому что k is log(maxNumber) базовый 10 и placement размер log(maxNumber) базовый 256. Но я не уверен, что это общее дело.
сортировка Radix использует сортировку подсчета для каждой цифры чисел в наборе данных. Счетная сортировка имеет сложность пространства O (n+k), где k-наибольшее число в наборе данных.
десятичные цифры варьируются от 0 до 9, поэтому, если мы сортируем 4 десятичных числа (11,22,88,99), используя сортировку radix (подсчет сортировки, используемой в сортировке radix), для каждой цифры он создаст массив размера b = 10, где b является базой.
Это означает, что общее используемое пространство будет общим числом * (n + base). Если итого цифры постоянны. Сложность пространства становится O (N + base).
следовательно, сложность пространства сортировки Radix равна O (n+b).