考虑一个由
n
个数字组成的数组,最大有k
位数(参见Edit)。考虑来自这里的基数排序程序: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
桶基本上是一个包含所有数字的二维列表。然而,只有n个值将被添加到其中。为什么空间复杂度是O(k + n),而不是O(n)?即使考虑用于提取特定位置数字的空间,它也仅使用1(常量)内存空间。
编辑:我想解释一下我对k的理解。假设我给出一个输入:[12, 13, 65, 32, 789, 1, 3]
,链接中的算法将经过4次迭代(在函数的第一个while
循环内)。在这里,k=4,即数组中任何元素的最大位数+1。因此,k是通过的数量。这就是此算法的时间复杂度中涉及的相同k: O(kn)
。 我无法理解它在空间复杂度中的作用: O(k + n)
。
O(1)
。更重要的是,这个答案实际上并没有回答问题。 - hidefromkgb