案例1 :假设一个文件中有9亿条不重复的9位整数,现在要求对这个文件进行排序。
方法:bit 位操作
首先
32位机的寻址能力是 2的32次方, 即4G.寻址能力最大是这样了.
一个最大的9位整数为999999999
这9亿条数据是不重复的
声明一个bit数组,长度为10亿
一共需要10亿 / 8 / 1024 /1024 =120M
把内存中的数据全部初始化为0
读取文件中的数据,并将数据放入内存。比如读到一个数据为341245909这个数据,那就先在内存中找到341245909这个bit,并将bit值置为1
遍历整个bit数组,将bit为1的数组下标存入文件
然后再遍历一次,找出不为零的就可以了.
注意:
如果是有重复的数字,
需要考虑重复的情况
如果普遍多于2个,那么就要设置包含2个bit的数组
或者使用bitmap类型.
例如 5 :0000 0000 0000 0000 0000 0000 0000 0101
现在引入Bitmap,所谓Bitmap就是用一个bit来表示一个数据。平时32位存储一个数据,我们可以换一种想法,用一个字节32位来存储0-31这32个数据,例如我们对2,1,5,12这四个数据进行由小到大的排序,首先把32位初始化为0,我们可以把这4个数据存储为0000 0000 0000 0000 0001 0000 0010 0110
我们就把32位中的分别把 2 1 5 12位置为1,然后从第0位开始遍历,看相应位是否为1,为1就进行输出,就完成了数据从小到大的排序。
再返回原题应用Bitmap就可以把16GB的存储空间缩小为16GB/32 = 512M,就可以大大减少读取文件的工作。直接读一次文件存入内存,然后遍历输出就完成了排序。
优点:既大量节省了空间,又把时间复杂度降低到O(n)。
不足:如果数据过于稀疏就会有大量无用遍历,浪费时间。