我正在为本周的考试而学习,我遇到了一个问题的评论问题......
0范围内的2千万个正整数。 。 。 99,999,999将按LSD基数排序。比较使用基数0的性能。 。 。 9999和基数0。 。 。 9.展示你的 工作
我知道基数排序的时间是theta(d(k + n));其中d =位数k =基数大小,n =记录数。
我理解十进制基数是theta(8(10 + 20,000,000)),对吗?
成千上万的基数是多少? THETA(3(1000 + 20000000))?
答案 0 :(得分:0)
你是对的,运行时是O(d(n + k))。明确计算出d和k之间的关系可能会有所帮助。如果你正在处理从0到数字U的数字,那么每个数字中的基数为k的数字将为Θ(log k U)=Θ(log U / log K)。这意味着运行时更合适O(log U(n + k)/ log k)。
在你的情况下,k与n相比非常小,所以这个运行时将具有for O(n log U / log k)。
您声称运行时间为Θ(8(10 + 20,000,000))和Θ(3(1,000 + 20,000,000))有点奇怪。请记住,Θ符号是关于长期增长率而不是单个值,所以以这种方式插入值是没有意义的。但是,你的基本论点是正确的。从基数10到基数10000,基数的数量级增加了3倍,所以你应该期望算法在基数较大时大约快三倍。
尽管如此,还有许多其他因素可能会影响实际的时机。引用的位置在执行大量数组操作的算法的运行时间中起着很大的作用,并且当您增加桶的数量时,您的局部性会逐渐变差。实际上,这可能最终会使较大的基类排序比较小的基类排序慢,因为即使轮数较少,每轮由于缓存效果而需要更长的时间。如果没有尝试过这个,我会打赌这很有可能在实践中会发生这种情况。