如何按照 query 的频度排序

题目描述:

有 10 个文件,大小均为 1GB,每个文件的每一行存放的都是用户的 query,每个文件的 query 都可能重复。要求按照 query 的频度排序。

分析与解答:

对于这种题,如果 query 的重复度比较大,则可以考虑一次性把所有 query 读入到内存中处理;如果 query 的重复率不高,可用的内存不足以容纳所有的 query,那么就需要使用分治法或者其他的方法来解决。
方法一:hash_map 法
如果 query 的重复率比较高,则说明不同的 query 总数比较小,可以考虑把所有的 query 都加载到内存中的 hash_map 中(由于 hash_map 中针对每个不同的 query 只保存一个键值对,因此,这些 query 占用的空间会远小于 10GB,有希望把它们一次性都加载到内存中)。接着就可以对 hash_map 按照 query 出现的次数进行排序。
方法二:分治法
这种方法需要根据数据量的大小以及可用内存的大小来确定问题划分的规模。对本题而言,可以顺序遍历 10 个文件中的 query,通过 hash 函数 hash(query)%10 把这些 query 划分到 10 个文件中。通过这样的划分,每个文件的大小为 1GB 左右,当然可以根据实际情况来调整 hash 函数。如果可用内存很小,则可以把这些 query 划分到更多更小的文件中。
如果划分后的文件还是比较大,则可以使用相同的方法继续划分,直到每个文件都可以被读取到内存中进行处理为止,然后对每个划分后的小文件使用 hash_map 统计每个 query 出现的次数,最后根据出现次数排序,并把排序好的 query 以及出现次数写入到另外一个单独的文件中。这样针对每个文件,都可以得到一个按照 query 出现次数排序的文件。
接着对所有的文件按照 query 的出现次数进行排序,这里可以使用归并排序(由于无法把所有的 query 都读入到内存中,因此这里需要使用外排序)。

posted @ 2020-06-13 21:11  橙宝技术  阅读(274)  评论(0编辑  收藏  举报