海量数字里,找出topK
找出topK,这个很明显想到可以用最大堆去做;而数据量过大的话,可以分而治之,就是把这些数据划分到多个文件里面,对每个文件找出topK,最后再合并到一起,找出总的topK
至于怎么划分,可以使用一些哈希算法来划分,或者因为这里这是比较值的大小,所以直接进行机械划分也是可以的。
海量数据里,返回出现频率最高的topK
同样还是用最大堆,但是这个大不再是数值的大,而是频率的大,所以可以使用一个HashMap,value来记录出现的频率。当然如果数据太大的话,还是可以使用分而治之的方法,可以使用一些哈希算法去进行分组,保证相同的数据在一个文件里面。最后再进行归并
另外,如果
两个文件的数据,找出相同的部分
如果是数字,可以使用一个BitMap来做,就是一个比特可以标记一个数字,比如说0代表没有出现,而1代表出现过。那么首先可以对其中一个文件进行标记,把标记完的BitMap再拿去第二个文件中去比较,进而就能找到相同的部分了。当然这个过程依然也是可以使用分而治之的方法
如果是字符串的话,可以考虑使用布隆过滤器,这个其实用现成的,Google不是有个Guava工具么,它里面就有BloomFilter类,可以做这个事情。
在海量数据中快速定位一个数字是不是在里面
思路也一样,用bitMap
海量数据中找到所有出现次数大于2次的
也可以使用BitMap来做,用两个比特标识一个数字的出现情况,比如说00表示从未出现过,01表示出现过一次,10表示出现过两次,11表示出现两次或以上的。那么对所有数据标识完之后,找到那些标记位位11的就是结果了