我正在阅读算法第2版的介绍,并且有一个问题是我们可以在线性时间内对0和n 3 -1之间的n个整数进行排序。我正在考虑IBM的基数排序方法。我从最低有效数字开始,相对于最低有效数字分开数字,然后排序,然后相对于下一个最低有效数字分开,依此类推。每次分离需要O(n)次。但我有一个疑问,例如,如果其中一个数字由n个数字组成,那么算法需要O(1 * n + 2 * n + ... + n * n)= O(n 2 时间,对吗?我们能否确保数字少于n位数,或者是否有人可以提出另一个问题提示?感谢
答案 0 :(得分:3)
基数排序复杂度为O(dn)
,d
为数字中的位数。
只有当d
不变时,算法才会以线性时间运行!在您的情况下d = 3log(n)
,您的算法将在O(nlog(n))
中运行。
老实说,我不确定如何在线性时间内解决这个问题。是否有关于数字性质的其他信息,我想知道是否有任何其他信息缺失关于数字的性质......
答案 1 :(得分:2)
假设一个字RAM模型,并且n适合O(1)个字,则有一个线性时间算法。
将每个数字写入基数n,并进行基数排序(使用稳定版本的计数排序作为基础数字排序)。
如果你想假设无界n,那么输入的大小实际上是n log n,在这种情况下,基数排序再次起作用(在O(n log n)时间内),从技术上讲,它仍然是线性的时间算法! (当然,我认为这仍假设算术是O(1)...)