我正在阅读算法导论第二版,其中有一个问题说我们可以在线性时间内对介于0和n3-1之间的n个整数进行排序。我考虑使用IBM的基数排序方法。我从最低有效位开始,根据最低有效位将数字分开,然后排序,接着按照次低有效位分开并排序,以此类推。每个分离需要O(n)时间。但我有一个疑问,例如,如果其中一个数字包含n位数字,则该算法需要O(1*n+2*n+...+n*n)=O(n2)时间,对吗?我们可以保证数字少于n位数吗?还是有人能给出这个问题的另一个提示吗?谢谢
我正在阅读算法导论第二版,其中有一个问题说我们可以在线性时间内对介于0和n3-1之间的n个整数进行排序。我考虑使用IBM的基数排序方法。我从最低有效位开始,根据最低有效位将数字分开,然后排序,接着按照次低有效位分开并排序,以此类推。每个分离需要O(n)时间。但我有一个疑问,例如,如果其中一个数字包含n位数字,则该算法需要O(1*n+2*n+...+n*n)=O(n2)时间,对吗?我们可以保证数字少于n位数吗?还是有人能给出这个问题的另一个提示吗?谢谢
基数排序的复杂度是O(dn)
,其中d
是数字中位数的数量。
当d
为常数时,该算法仅以线性时间运行!在您的情况下,d = 3log(n)
,因此您的算法将以O(nlog(n))
运行。
老实说,我不确定如何以线性时间解决这个问题。是否有关于数字性质的其他信息?我想知道是否缺少任何其他信息...
n**3-1
在基数为 n
的情况下需要 3 位数字。2. 你不能期望对于任意大的 n
,在基数为 n
的情况下操作一个数字是 O(1)(常数时间)。 - jfs假设采用字RAM模型,并且n适合于O(1)个字,这时有一种线性时间算法。
将每个数字写成n进制,并使用基数排序(底层位排序采用稳定的计数排序)。
如果要假设n无限大,则输入的大小实际上是n log n。这种情况下,基数排序仍然适用(在O(n log n)的时间内),而从技术角度来说,它仍然是一种线性时间算法!(当然,我想这还是假设算术时间复杂度为O(1)...)
O(nlog(n))
的,但如果你认为这是一个线性解决方案,那么使用良好的快速排序、归并排序或其他算法实现,问题将变得非常简单... - Marsellus Wallace