【问题标题】:Best Base for Radix Sort基数排序的最佳基础
【发布时间】:2014-06-02 11:00:30
【问题描述】:

我已阅读有关此主题的多个来源。但是,我很难弄清楚这些公式的确切含义。当 b = n 时,基数排序似乎是线性的。这是否意味着,我应该将基数设置为数组的长度?

如果我有一个 1 亿整数的数组,范围从 0 到 10 亿,我应该选择基数 1 亿?

如果这不正确,请尝试为我简化它。我能找到的大多数基数排序示例只有以 10 为底或以 2 为底,因此它们对于分别大于 10 或 2 的数组来说很慢,或者我就是不明白。

感谢您的帮助。

【问题讨论】:

    标签: performance algorithm sorting radix-sort radix


    【解决方案1】:

    当您将基数设置为数组中的条目数时,基数排序实际上并不是线性时间。基数排序的运行时间为 O(n logb U),其中 n 是数组中元素的总数,b 是选择的基数,U 是数组中的最大数。如果设置 b = n,则运行时间为 O(n logn U) = O(n log U / log n)。渐近,这真的很棒!

    但在实践中,其他因素在评估基数排序时往往更为重要。一方面是将数字拆分为单个数字的成本。使用一个 2 的幂的基数,这只是一个简单的位移。对于其他基地,您可能需要使用(相对)更昂贵的部门,这可能会有点伤害。不过,更重要的是,有参考的地方性。如果您使用基数 b,那么您将拥有 b 个不同的数组,元素被放入其中。如果选择的 b 太高,那么在将元素附加到存储桶数组的末尾时,缓存性能可能会很差,这实际上会导致性能下降。

    也许最好的办法是根据不同的基本选择实际分析程序,看看什么是最好的。根据经验,当我尝试使用 base-n 基数排序时,我发现它在大型输入上比标准的 base-2 基数排序慢,主要是由于局部性问题。我猜想 2 不是基数排序的理想基础,但是像 216 这样的大数据可能会开始遭受缓存未命中的困扰。尝试试验并告诉我们您的发现!

    希望这会有所帮助!

    【讨论】:

    • 嗨,您说“使用 base-n 基数排序,我发现它比大型输入上的标准 base-2 基数排序要慢”。然后你说,“我猜 2 不是基数排序的理想基数”。当 base-2 比 base-n 快时,为什么要说后一种说法?
    • @chandresh 该声明的主要意思是“我没有任何先验理由相信两个是所有可能的基础中最好的。”很有可能它是最好的,但没有做更多的测试我不能肯定。
    • 好的。我想在我的 Q 上收到你们的 cmets:cstheory.stackexchange.com/questions/32128/…
    【解决方案2】:

    对于您的情况,最佳基数排序基数是 2^16 (65536) 或 2^8 (256)。 在第一种情况下,您将为每个元素的两次移动对数组进行排序,在第二种情况下 - 为 4 次移动。

    【讨论】:

    • 你能详细说明为什么这个值是最好的吗?
    • 因为这是 sizeof(int) 的 1/2 或 1/4。使用 256,您将使用更少的额外内存,但总共需要 4 个移动。使用 256*256,您只需 2 次移动即可获得结果(对于 eqch int),但您需要大量额外内存用于计数器:sizeof(int) * 2 * 256*256 bytes = 512Mb。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多