1、题目一
进阶:如果是只有3kb的内存,怎么找出一个没出现过的数?
设置一个int数组,一个位置的内存大小数4b,一共分3000/4分,向下取2的9次方即512,即设置一个数组为int[512],对42亿个数字分成42亿/512,如果一个数出现一次,在对应的数组位置词频++,找到没有满的词频,继续在数组上int[512]上进行词频统计,周而复始。
进阶:如果只用几个变量,怎么找出一个没出现过的数?
对42亿个数进行二分,哪一边没满的就继续进行二分。
2、题目二
补充问题解题:利用堆的技巧:每个小文件里形成堆,再把每个文件的堆顶组成一个堆
3、题目三:
补充问题解题:先看10kb能实现多大的无符号整型数组?一个无符号整数是4kb,所以可以有10kb/4kb=2.5kb即2500个长度,然后找出2的多少次方离2500最近,找到2048即2的11次方,即一共分成2^11方个组,设置一个int[2048的数组,]对2^32次方个数遍历,然后用2^32/2^11表示每个组的范围是多大,然后属于哪个组哪个组就++,为了找出中位数就是把每个组的词频相加刚好加到或者超过2^32/2。
4、题目四:
五、题目五:
有一个10G文件,里面每一行都是一个有符号整数,无序,如果你只有5G的内存,如何输出一个新的文件并且变得有序
有一个小根堆,记录的是:X,4个。每一条记录8字节,小根堆根据数值X组织。小根堆可以存储5G/16字节条数据,(16是因为除了本身一条记录占了8字节内存,其他索引空间可能也占了内存),支持5*2^26次方条记录,最接近为2^27,有符号整数的范围是2^32次方,等分2^5份,每份范围为2^27,建立小根堆,过一遍大文件的数,但是只关心属于-2^31~-2^31 + 2^27 -1这个范围的数,如果不是就忽略。过往一遍之后小根堆上就记录了-2^31~-2^31 + 2^27 -1这个范围的词频情况,并且是按照小根堆组织的。
六、题目六:
判断一个32位正数是不是2的幂、4的幂
解:2的幂的条件是二进制中只有一个1。
4的幂:先判断是不是2的幂,如果是2的幂(只有一个1),那么判断4的幂的特征:1的位置在0、2、4这些位上。跟0101010101....0101与,如果等于0就是4的幂