Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm O(1)空间中的计数排序_Algorithm_Sorting_Big O_Complexity Theory_Counting Sort - Fatal编程技术网

Algorithm O(1)空间中的计数排序

Algorithm O(1)空间中的计数排序,algorithm,sorting,big-o,complexity-theory,counting-sort,Algorithm,Sorting,Big O,Complexity Theory,Counting Sort,我有下面的计数排序,但是空间复杂度对我来说太高了,我正在寻找一种在空间复杂度为O(1)的情况下实现它的方法 目前,该算法正在分配O(k)空间。 假设k我在这里假设A是您的输入数组,B是您的输出数组。因此,|A |=|B |。我进一步假设k是我们可能遇到的最大值数(例如,如果A只包含从1到k或从0到k-1的正数)。如果您在提问时指定此类细节,这将对我们有所帮助,但我猜这或多或少就是您所问的问题。:) 因为我们有一个非常方便的附加约束,k请告诉我们A,B和k代表什么?反向工程:A是输入数组,k是A中

我有下面的计数排序,但是空间复杂度对我来说太高了,我正在寻找一种在空间复杂度为O(1)的情况下实现它的方法

目前,该算法正在分配O(k)空间。
假设
k我在这里假设
A
是您的输入数组,
B
是您的输出数组。因此,
|A |=|B |
。我进一步假设
k
是我们可能遇到的最大值数(例如,如果
A
只包含从1到k或从0到k-1的正数)。如果您在提问时指定此类细节,这将对我们有所帮助,但我猜这或多或少就是您所问的问题。:)


因为我们有一个非常方便的附加约束,
k请告诉我们
A
B
k
代表什么?反向工程:A是输入数组,k是A中的最大值,B是输出数组。我相信计数排序本质上是O(k)空间。如果您需要更少的空间,那么您需要(A)了解有关输入的更多细节,或者(B)使用完全不同的算法<等等,让我想想。使用A和B可能会有一些技巧。。。。啊!!是的,我们可以使用
B
作为临时的暂存空间,也许可以跳过G的使用。计算运行时复杂性和O(1)空间复杂性的排序将使世界变得更幸福。有没有理由假设k@phoxis是他/她在问题中说的。对不起,我错过了这一部分。在这种情况下,当输入大小有界时,它在任何情况下都变成O(1)。@phoxis是的,这是非常正确的,但这里我们没有常数
|A |
,至少从OP的信息来看是这样的。由于
k
|A |=n
为界,而不是以常量值为界,因此在OP的代码中,空间复杂度将是
O(k)=O(n)
,如果我们对
k
@phoxis一无所知,确实是的,通常需要排序算法来生成新的排序数组,或者对输入数组执行就地排序。OP的算法(在理论世界中)提供了这两个方面,这是一个不同寻常的事实,我认为这是为了强烈提示学生利用这个“空闲”内存来“欺骗”系统:)在一般情况下,空间复杂度肯定不是常数,而是取决于
k
n
,取决于实施情况。
MyCountingSort(A, B, k)
    for i = 0 to k
       do G[i] = 0
    for j = 0 to length[A]
        do G[A[j]] = G[A[j]] + 1
    for i = 1 to k
       do G[i] = G[i] + G[i-1]
    for j = length(A) to 1
       do B[G[A[j]]] = A[j]
       G[A[j]] = G[A[j]] - 1