Consider an array with n
numbers that has maximum k
digits (See Edit). Consider the radix sort program from here:
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
The buckets
basically is a 2d list of all the numbers. However, only n
values will be added to it. How come the space complexity is O(k + n) and not O(n)? Correct me if I am wrong, even if we consider the space used to extract digits in a particular place, it is only using 1 (constant) memory space?
Edit: I would like to explain my understanding of k
. Suppose I give an input of [12, 13, 65, 32, 789, 1, 3]
, the algorithm given in the link would go through 4 passes (of first while
loop inside the function). Here k
= 4, i.e. maximum no. of digits for any element in the array + 1. Thus k is no. of passes. This is the same k
involved in time complexity of this algorithm: O(kn)
which makes sense. I am not able to understand how it plays a role in space complexity: O(k + n)
.