基数的时间消耗排序

时间:2017-02-28 03:45:53

标签: algorithm

艾伦的书中有一句话,我真的不明白:

  

例如,如果我们在32 bits的桶大小上进行了三次传递,我们可以通过基数排序对计算机上可表示的所有整数(2^11)进行排序。此算法在此计算机上始终为O(N)

为什么O(N)

1 个答案:

答案 0 :(得分:1)

我的解释假设您已了解基数排序。

具有32位字长的计算机具有2^32-14,294,967,295个)可能的字大小整数(从0x00 00 00 000xFF FF FF FF)。

桶大小2^11表示每个桶通过11位宽的字段(0b000 0000 0000到0b111 1111 1111)收集整数

我们可以拆分这些整数'比特分为3个部分,如下:

0b | 0000 0000 00 | 00 0000 0000 0 | 000 0000 0000
   | ^section 3 ^ | ^  section 2 ^ | ^ section 1 ^
  1. Section 1是11个最无足轻重的位
  2. Section 2是11个下一个无用的位
  3. Section 3是剩余的10位
  4. 第1阶段

    要执行此排序,首先整数将按其Section 1位进行删除。水桶就像这样:

    0bXXXX XXXX XXXX XXXX XXX X000 0000 0000
    0bXXXX XXXX XXXX XXXX XXX X000 0000 0001
    0bXXXX XXXX XXXX XXXX XXX X000 0000 0011
     ...
    0bXXXX XXXX XXXX XXXX XXX X111 1111 1110
    0bXXXX XXXX XXXX XXXX XXX X111 1111 1111
    

    X代表无关(到这个阶段)位。每个整数根据其2^11位放入这些Section 1桶中的一个。这是O(N)操作。完成后,2^11桶按从低到高的顺序迭代,并将元素放入中间列表中。如果您只查看Section 1位,则此列表中的元素现已排序。

    第2阶段

    接下来,Stage 1中间列表中的整数按其Section 2位进行删除。水桶就像这样:

    0bXXXX XXXX XX00 0000 0000 0XXX XXXX XXXX
    0bXXXX XXXX XX00 0000 0000 1XXX XXXX XXXX
    0bXXXX XXXX XX00 0000 0001 1XXX XXXX XXXX
     ...
    0bXXXX XXXX XX11 1111 1110 1XXX XXXX XXXX
    0bXXXX XXXX XX11 1111 1111 1XXX XXXX XXXX
    

    每个整数根据其2^11位放入其中一个Section 2桶中。这是另一个O(N)操作。完成后,2^11桶按从低到高的顺序迭代,并将元素放入新的中间列表中。如果您只查看Section 1 Section 2位,则此列表中的元素现已排序。

    第3阶段

    接下来,Stage 2中间列表中的整数按其Section 3位进行删除。从理论上讲,如果计算机的字长为33 bit,我们可以使用所有2^11个存储区,并对33 bit中所有可能的O(N)整数进行排序。但就我们的目的而言,在这个阶段实际上只需要2^10个桶,如下所示:

    0b0000 0000 00XX XXXX XXXX XXXX XXXX XXXX
    0b0000 0000 01XX XXXX XXXX XXXX XXXX XXXX
    0b0000 0000 10XX XXXX XXXX XXXX XXXX XXXX
     ...
    0b1111 1111 10XX XXXX XXXX XXXX XXXX XXXX
    0b1111 1111 11XX XXXX XXXX XXXX XXXX XXXX
    

    每个整数根据其2^11位放入其中一个Section 3桶中。这是另一个O(N)操作。完成后,2^10桶按从低到高的顺序迭代,并将元素放入新列表中。由于Section 1Section 2Section 3位都已计算在内,因此此列表是最终的排序结果。

    摘要

    此过程需要6个O(N)进程:

    1. Section 1
    2. 分发到存储桶中
    3. 从水桶中收集
    4. Section 2
    5. 分发到存储桶中
    6. 从水桶中收集
    7. Section 3
    8. 分发到存储桶中
    9. 从水桶中收集
    10. 因此总的来说,这个算法是O(N)