在实际中,经常会碰到对大量数据的处理问题,这就需要合理地应用数据结构和算法,从而提升数据处理效率。以下归纳总结几种海量数据处理的常见问题。
1、如何在1亿个数据中找到最大的100个数
错误想法:对数据进行快速排序,最佳时间复杂度为O(nlogn),但需要一次性将所有数据读入内存,导致内存占用过多且全部排序没必要。
正确方法:分冶法+最小堆排序
原理:将数据划分为100块,将数据块分配给多台服务器,每个cpu处理一块数据,采用最小堆排序,读入前100个数来建立大小为100的最小堆(建堆的时间复杂度为O(mlogm)),然后遍历块中后续的数据,并依次与堆顶数据进行比较。若该数比最小的数小,则继续读取后续数据;若比最小数大,则替换堆顶元素并重新调整为最小堆,直至数据全部遍历完成。时间复杂度为O(nmlogm),空间复杂度为100。最后合并所有数据块中的前100个数据,同样采用最小堆排序得到最大的100个数。
参考博客:如何从一亿个数组里找出最大的十个。
2、10亿个整数找出重复次数最多的100个整数
方法:哈希表+分冶法+最小堆排序
原理:把数据散列后的值按范围划分为100个块,将块映射到不同的文件中;利用哈希表将每个块中的数据读入内存并记录出现的次数;采用最小堆排序找到每个块中出现次数最多的