之前介绍了一些海量数据处理的问题,今天我给大家介绍其他几种类型的海量数据的处理。
3. 给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集
4.1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数
首先看第三个问题,问题要把握关键点,这个题我认为关键点在题中的那一句我们只有1G内存,1G内存代表着什么,代表着你不能直接把你的所有数据读取进来然后不断的对比对比。仔细想想这里解决问题的办法还是和之前所介绍的还是有一定的相似的,不过今天这两个问题用到的全都是一种数据结构,用到的全都是位图的思想。先说一下第三个问题,这里和之前所说的第一个问题一样,确实是一大份,确实是需要把它分割成小份,但是这里就不能是传统的随意切割的思想。既然这是哈希的部分,也很容易就能想到通过哈希进行切分,将你的整块数据,通过哈希切分成一千份。这里的份数当然是自己来控制的,但是一千份是个比较好的数据,100亿的整数分成一千份如果是均等分的话也就是一个文件中有1000万个数,1000万个int类型数值占多少内存呢?1000万个int也就是4000万个字节,32000万个比特位。10亿个字节占了1G内存,也就是占了40兆的内存,内存完全可以调用这些文件。因为是通过哈希函数划分的,所以相等的数据一定是映射到了同等代号的文件,也就是假如第一个文件里有1他一定映射在了,第一个文件划分的一千个中的第一个,第二个文件也有1,那他也一定映射到了第二个文件划分的一千个中的第一个,那这样的话,只需要不断的对比,第一个文件中的第一个小文件和第二个文件中的第一个小文件,不断的比下去,这样就能找出来相同的数值了。这里映射的方式采用更节省内存的方式就是位图,将数据映射到每一位来代表有没有出现,你可以先映射文件一的小文件,然后映射文件二的小文件,如果文件二映射的时候发现那个位置已经是1了,那就说明这个数算是两个文件的交集。之后不断遍历下去。直到最后。
4. 再看第四个问题,1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数
这个问题在上次也给过思想了,上次是找到只出现一次的数字,也就是说之前的数据会有三种状态,一个是没出现,一个是出现一次,一个是出现多次。但是这个题中状态就有所增加,现在这个题需要表示的状态是,数据没出现,出现了一次,出现了两次,出现了比两次更多的次数,也就是说现在有四种状态,二进制中虽然只有01,但是还是只需要两个二进制位就可以表达四种状态。所以这里依然是给每个数据分配了两个二进制位。来表达数据出现的次数。这样就能表达数据的四种状态。但是这样可以吗?还是去找题目的重点,1G内存,但是这里如果按以前的划分方式还是划分到一千个文件,相对来说是比较复杂的。但是这里要均等分割吗?均等分割肯定是不行的,假如你现在把这个文件分成了两份,万一有个数在第一个里边一个在第二个里边一个呢?虽这是小概率情况,但是不能否认这种情况的存在。所以这里划分的话还是要有一定的依据。这里你可以设定一个值,两个或者多个,大于这个值在一个文件小于在另一个文件,这样划分就能相对好的解决这个问题。
这两个题虽然和之前两个题有很多一样的地方,但是这里还是有一些改进, 在日常的生活中,情况和数据都要更加的复杂,和哈希一样这种思想会有更多更复杂的运用,所以知道以后会在其他方面有更多的改进之后会有很多应用的地方。