我被要求创建一种算法,该算法采用M个数组,所有数组的范围都在1-k,它们的大小组合为'n',然后将它们全部以O(k + n)的形式排序(与计数排序相同) )。天真的计数排序将花费O(km + n)。
要克服的显而易见的枪管是在辅助阵列上移动m次。我提供了以下解决方案,但他说我的复杂度为O(km + n): 我们将为每个声明其自己的数字集的数组创建vector_i。例如,数组“ 1,5,4,1,2”将表示为<2,1,0,1,1>。 然后,对于每个数字,“附加”值以创建m个长度的k个数字。现在,当我们经过计数数组中的每个单元格时,我们将立即将正确数量的“ i”值数字放入正确的数组中。 (每个数组中都有指向我们当前位置的指针。)
他可能会误解我的意思,但对我来说似乎很清楚O(k + n)。他认可的一个答案将所有数组组合为一个,并在每个元素上放置一个标记,指出该数组属于哪个数组。
我对自己的灵魂非常有信心,但我很想听听评论,以确保我没有记错。 谢谢,非常感谢。
答案 0 :(得分:0)
我们将为每个数组创建vector_i,以声明自己的数字集。
由于您需要查看n个元素中的每个元素来填充这些矢量,因此第一部分将花费O(n)
时间。
现在,当我们经过计数数组中的每个单元格时,我们将立即将正确数量的“ i”值放入正确的数组中。
您为m个数组中的每个数组创建一个向量,因此有m个向量。您还说过,每个向量都是in range 1-k
。这意味着您新创建的数组中最多有k*m
个项目。由于您一次要遍历这些向量来填充原始数组,因此这部分的时间复杂度为O(km)
。
这使总时间复杂度达到O(km + n)
。