基数排序时间
Posted
技术标签:
【中文标题】基数排序时间【英文标题】:Radix Sort Time 【发布时间】:2011-11-17 20:23:07 【问题描述】:我正在为本周的考试而学习,我遇到了一个复习问题,问...
0 范围内的两千万个正整数。 . . 99,999,999 将通过 LSD 基数排序进行排序。比较使用 radix 0 的性能。 . . 9999 和基数 0 。 . . 9. 展示你的 工作。
我知道基数排序的时间是 theta(d(k+n));其中 d = 位数 k= 基数大小和 n = 记录数。
我知道十进制基数是 theta(8(10+20,000,000)),对吗?
千基是多少? theta(3(1000+20,000,000))?
【问题讨论】:
数一数你的位数,这不是千位基数。 那么应该是theta(2(10000+20,000,000))吗?那个基数会叫什么? Myrias,如果你想吹嘘一点希腊语。或者一万,如果你想被理解的话。 所以我可以说使用万基数的速度大约是使用十进制基数的 4 倍? 似乎如此(对于足够大的数据样本)。但是,由于实现细节、缓存位置的原因,实际的关系可能会有所不同...... 【参考方案1】:你说得对,运行时间是 O(d(n + k))。明确地计算出 d 和 k 之间的关系可能会有所帮助。如果您正在处理从 0 到数字 U 的数字,那么每个数字中的 base-k 位数将为 Θ(logk 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 倍增加,因此您应该期望算法在基数越大时大约***倍。
也就是说,还有很多其他因素可能会在实践中打乱这个时机。引用的局部性在执行大量数组操作的算法的运行时间中起着重要作用,并且随着存储桶数量的增加,局部性会逐渐变差。这实际上可能最终使大基数排序比小基数排序慢,因为即使轮数较少,由于缓存效应,每一轮都需要更长的时间。如果没有尝试过,我敢打赌这很有可能在实践中会发生。
【讨论】:
以上是关于基数排序时间的主要内容,如果未能解决你的问题,请参考以下文章