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)
base10
,而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