1、找出中位数
思想: 划分区间,遍历数组将对应的数据放在对应的桶中,并统计每个桶中的元素数量,只要两次读取全部的数据就可以
重点/细节: (1)、两次读取数据,第一次划分区间划分的比较细,第二次划分就可以粗一点
划分区间的思想另外一个应用:找出最大的重复的URL\IP\WORLD,首先就是进行一个映射hash(因为对字符无法进行大小的划分,数字最好),然后进行大区间的划分,再划分更小的区间。
(2)、对数据的大小以及内存的计算(1G=10^9byte 1亿=10^8),具体的计算可以看这个,里面还有其他方法的分析
2、找出重复的IP 或 重复/出现 次数最高的URL
基本思想: 只有利用哈希才能找到重复的元素,所以还是利用哈希的思想
比如有10个文件/数据,将这么多的数据哈希映射到1000个小文件中,然后再对每一个小的文件进行哈希处理,这样就不是大数问题了(其中映射到不同的文件的思想就是桶的思想,比如想将数据映射到0-2000的区间,直接 hash(x)%2000,统计出现频率的话一般用 hashmap)
http://blog.sina.com.cn/s/blog_7ebe664201013ggv.html (用的桶实现)
note: 单找重复的URL ,其中还可以用 bloom filter
3、找出top10 / top100大的数
**思想:**面对大数问题,本质还是改为小数据量问题,所以这里将不同的数据分为不同的分区,再找出分区中最大的N个数据,然后统一做对比。一般来说有下述两种方式来实现:
(1)、可以对最小堆来实现,而不是最大堆,然后不断的读取数据
(2)、每次读取一千万或者其他大小的进行排序,找出最大的100个数,然后不断这样,最后将这些前100的放在一起,再找出最后的top100),找出top100的过程可以根据最小堆实现或者快拍实现等
——————————————————————
资料
这篇介绍的都比较详细,重复的,大数据量的,小数据量的,以及topk的都有介绍。
Bloom Filter:
和 bitmap 类似的处理方式,设置 K 个哈希函数,将元素分别使用K个哈希函数得到 K 个位置,然后对应映射到M位位数组的位置,当某个元素映射的K个位置都被置为1时,我们大概率认为该元素已经存在。
bitmap
使用位来指示是否该位置被占用,一般用于重复元素的查找和堆数据的排序,还可以有 2-bitmap n-bitmap,看是否有重复等等
hashmap
也是一个 key_value的形式,在此之外加上一个next指针指向下一个元素,最主要的是其采用数组+(链表/红黑树),数组具有查询效率高,链表和红黑树的插入删除效率高。
最通俗易懂搞定HashMap的底层原理
其中里面涉及到了很多hashset hashmap(hashset是一个set也就是集合,但不是有序的也允许重复,重点实在hash,hashmap也就是一个键值对,重点也在hash,和C++里面的set map不同)
计算问题
1字节=8位 (1 byte = 8bit)
eg: 1 int = 4 byte = 32 bit
1G = 10^9 byte
1 亿 = 10^8