我的想法是
1 首先利用取模分块文件存储,如用hash(ip)对1000取模,这样就大概分成了1000个文件(同一个ip只可能出现在一个文件里)
2 然后 从一个文件开始到第1000个文件,对每个文件分别进行这种操作:
放进内存中, 利用hash技术求出每个ip对应的出现次数,然后求出该文件中出现次数前10的放在内存中(堆或类快排),剩下的丢掉
3 此时内存中剩下10*1000个ip,用第一个文件的10个建立最小堆
4 然后 对于剩下的每一个ip: 与跟元素的出现次数比较,如果大于,替换之,然后调整堆使其保持最小堆的性质,否则,无处理(或者34步可以用下面方法代替)
(34的代替方案)用类似快速排序的方法选出出现次数前10的ip
即最小堆中始终保持最大的10个ip的出现次数
ps:好像用类快排选择最大的k个数平均情况 T(n)=T(n/2)+n 时间复杂度应该为O(n) ,所以这个应该更好