sort-the-query-strings-by-counts.md 1.4 KB
Newer Older
Y
yanglbme 已提交
1 2 3
## 如何按照 query 的频度排序?

### 题目描述
Y
yanglbme 已提交
4

Y
yanglbme 已提交
5 6 7
有 10 个文件,每个文件大小为 1G,每个文件的每一行存放的都是用户的 query,每个文件的 query 都可能重复。要求按照 query 的频度排序。

### 解答思路
Y
yanglbme 已提交
8

Y
yanglbme 已提交
9 10 11
如果 query 的重复度比较大,可以考虑一次性把所有 query 读入内存中处理;如果 query 的重复率不高,那么可用内存不足以容纳所有的 query,这时候就需要采用分治法或其他的方法来解决。

#### 方法一:HashMap 法
Y
yanglbme 已提交
12

Y
yanglbme 已提交
13 14 15
如果 query 重复率高,说明不同 query 总数比较小,可以考虑把所有的 query 都加载到内存中的 HashMap 中。接着就可以按照 query 出现的次数进行排序。

#### 方法二:分治法
Y
yanglbme 已提交
16

Y
yanglbme 已提交
17 18 19 20 21
分治法需要根据数据量大小以及可用内存的大小来确定问题划分的规模。对于这道题,可以顺序遍历 10 个文件中的 query,通过 Hash 函数 `hash(query) % 10` 把这些 query 划分到 10 个小文件中。之后对每个小文件使用 HashMap 统计 query 出现次数,根据次数排序并写入到零外一个单独文件中。

接着对所有文件按照 query 的次数进行排序,这里可以使用归并排序(由于无法把所有 query 都读入内存,因此需要使用外排序)。

### 方法总结
Y
yanglbme 已提交
22

Y
yanglbme 已提交
23 24
- 内存若够,直接读入进行排序;
- 内存不够,先划分为小文件,小文件排好序后,整理使用外排序进行归并。