这里是我在网上搜索的一些面试常见算法,总结一下,利人利己。
top k 问题:
选取第k大(前k大)的数可以采用类似于快速排序的方法, 利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:
1. Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数;
2. Sa中元素的个数大于等于k,则返回Sa中的第k大数。时间复杂度近似为O(n)
也可以用最大堆的方法,pop k次即可。
海量数据的top k 问题:
比如在一亿(N)个数中选取最大的10000(m)个,这时候要分情况讨论,如果说内存不足的话,那么可以采用建立一个m最小堆,然后遍历N个数,如果大于堆顶则插入。
如果内存足够的情况,可以直接采用快速排序方法,可以借助分治法,比如把N个数分为100份数,分别找出100个最大的10000,然后最后在100万中找10000个最大的。
选取频率最高问题
海量数据的top k 问题,如果有1g大小的文件,需要统计其中出现频率最高的100个词,有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。
方案:顺序读文件中,对于每个词x,取hash(x)%5000,然后按照该值存到5000个小文件(记为x