Python 为什么基数排序的空间复杂度为O(k+;n)?

Python 为什么基数排序的空间复杂度为O(k+;n)?,python,algorithm,sorting,space-complexity,radix-sort,Python,Algorithm,Sorting,Space Complexity,Radix Sort,考虑一个具有最大k位数的n数字的数组(请参见编辑)。从:考虑基数排序程序 bucket基本上是所有数字的2d列表。但是,只将n值添加到它。为什么空间复杂度是O(k+n)而不是O(n)?如果我错了,请纠正我,即使我们考虑在特定的地方提取数字的空间,它只使用1(常量)的内存空间。 编辑:我想解释一下我对k的理解。假设我输入[12,13,65,32,789,1,3],链接中给出的算法将经过4次过程(第一次,而在函数中循环)。此处k=4,即数组中任何元素的最大位数+1。因此,k是通行证的数量。这与该算法

考虑一个具有最大
k
位数的
n
数字的数组(请参见编辑)。从:

考虑基数排序程序
bucket
基本上是所有数字的2d列表。但是,只将
n
值添加到它。为什么空间复杂度是O(k+n)而不是O(n)?如果我错了,请纠正我,即使我们考虑在特定的地方提取数字的空间,它只使用1(常量)的内存空间。
编辑:我想解释一下我对
k
的理解。假设我输入
[12,13,65,32,789,1,3]
,链接中给出的算法将经过4次过程(第一次
,而在函数中循环)。此处
k
=4,即数组中任何元素的最大位数+1。因此,k是通行证的数量。这与该算法的时间复杂度所涉及的
k
相同:
O(kn)
,这是有意义的。我无法理解它是如何在空间复杂性中扮演角色的:
O(k+n)

基数排序的空间复杂度与它用于排序每个基数的排序绑定。在最好的情况下,这就是计数排序

以下是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的辅助数组


因为基数排序使用计数排序,计数排序的空间复杂度是基数排序的空间复杂度的下限。

我认为这是一个术语问题。问题实现的空间复杂度和本文中提到的实现是
O(n+k)
。但是
k
不是最长单词(或最长数字)的长度
k
是“字母表”的大小:不同数字(数字)或字母(文字)的数量

bucket=[list()表示范围内的(基数)]

此代码使用
基数
元素创建数组。在这个特定的实现中,
基数
是一个常量(空间复杂度为O(n)),但通常是一个变量
RADIX
是一个
k
,是不同数字(字母表中的字母)的数目。并且这个
k
不依赖于
n
,并且在某些情况下可以大于
n
,因此空间复杂度通常为O(n+k)


编辑:在实现中,
placement
(或
tmp
)的大小是
O(k)
(根据您对
k
的定义),因为
k
log(maxNumber)
base
10
,而
placement
大小是
log(maxNumber)
base<256
。但我不确定这是否是一种普遍情况。

基数排序对数据集中的每个数字使用计数排序。计数排序的空间复杂度为O(n+k),其中k是数据集中的最大数

十进制数字的范围从0到9,因此,如果我们使用基数排序(基数排序中使用的计数排序)对4个十进制数字(11,22,88,99)进行排序,那么对于每个数字,它将创建大小为b=10的数组,其中b是基

这意味着使用的总空间将是总位数*(n+base)。如果总数字是常数。空间复杂度变为O(n+base)


因此基数排序的空间复杂度是O(n+b)。

这完全是错误的,例如,您可以找到我的就地基数排序的实现,其空间复杂度为
O(1)
。更重要的是,这个答案实际上并没有回答这个问题。如果算法采用可变大小的输入,它就不会有O(1)空间复杂度。空间复杂度是对算法需要的工作存储量的度量。如果算法在阵列上运行,则需要该阵列作为存储。就地并不意味着O(1)。此外,我只是在这里引用CLR。如果你能证明那些家伙是错的,那么我认为你将获得比stack overflow rep.Meh多一点的好处。我错了。额外空间复杂性≠ 实际空间复杂性。我现在明白你的意思了+1.抱歉延迟接受答复。我现在才满意地理解这一点。是的。k表示数字。我不相信k和基数或它的长度是一样的。基数永远是10。但是,如果至少有一个三位数,其余的是2或1位数,k将是3。@skr_robo,这就是我所说的,在
O(n+k)
中,k不是某个数字中的最大位数。@DAIe如果我们输入这个数组=[12,13,65,32,789,1,3],上述算法将运行4次(因为有一个3位数)。现在,时间复杂度是O(kn),这k是通过的次数,是4。我的观点是O(k+n)也有相同的k。我不明白为什么基数在这里起作用。我在调用
k
最大位数时出错。它比这多了一个。
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