笨鸟教程 - 程序员AI编程教程 - 分治法
type: channel
link: http://www.javatiku.cn/tag/分治法/
items: 如何在大量的数据中找出不重复的整数？
items: 如何在大量的数据中判断一个数是否存在？
items: 如何查询最热门的查询串？
items: 如何按照 query 的频度排序？
items: 如何从 5 亿个数中找出中位数？

如何在大量的数据中找出不重复的整数？
type: item
date: 2021-09-25T21:06:00+08:00
description: 题目描述在 2.5 亿个整数中找出不重复的整数。注意：内存不足以容纳这 2.5 亿个整数。解答思路方法一：分治法与前面的题目方法类似，先将 2.5 亿个数划分到多个小文件，用 HashSet/HashMap 找出每个小文件中不重复的整数，再合并每个子结果，即为最终结果。[...]

如何在大量的数据中判断一个数是否存在？
type: item
date: 2021-09-24T21:08:00+08:00
description: 题目描述给定 40 亿个不重复的没排过序的 unsigned int 型整数，然后再给定一个数，如何快速判断这个数是否在这 40 亿个整数当中？解答思路方法一：分治法依然可以用分治法解决，方法与前面类似，就不再次赘述了。[...]

如何查询最热门的查询串？
type: item
date: 2021-09-23T21:11:00+08:00
description: 题目描述搜索引擎会通过日志文件把用户每次检索使用的所有查询串都记录下来，每个查询串的长度不超过 255 字节。假设目前有 1000w 个记录（这些查询串的重复度比较高，虽然总数是 1000w，但如果除去重复后，则不超过 300w 个）。请统计最热门的 10 个查询串，要求使用的内存不能超过 1G。（一个查询串的重复度越高，说明查询它的用户越多，也就越热门。）解答思路每个查询串最长为 255B，1000w 个串需要占用 约 2.55G 内存，因此，我们无法将所有字符串全部读入到内存中处理。[...]

如何按照 query 的频度排序？
type: item
date: 2021-09-21T21:19:00+08:00
description: 题目描述有 10 个文件，每个文件大小为 1G，每个文件的每一行存放的都是用户的 query，每个文件的 query 都可能重复。要求按照 query 的频度排序。解答思路如果 query 的重复度比较大，可以考虑一次性把所有 query 读入内存中处理；如果 query 的重复率不高，那么可用内存不足以容纳所有的 query，这时候就需要采用分治法或其他的方法来解决。方法一：HashMap 法[...]

如何从 5 亿个数中找出中位数？
type: item
date: 2021-09-21T21:17:00+08:00
description: 题目描述从 5 亿个数中找出中位数。数据排序后，位置在最中间的数就是中位数。当样本数为奇数时，中位数为 第 (N+1)/2 个数；当样本数为偶数时，中位数为 第 N/2 个数与第 1+N/2 个数的均值。解答思路如果这道题没有内存大小限制，则可以把所有数读到内存中排序后找出中位数。但是最好的排序算法的时间复杂度都为 O(NlogN) 。这里使用其他方法。方法一：双堆法维护两个堆，一个大顶堆，一个小顶堆。大顶堆中最大的数小于等于小顶堆中最小的数；保证这两个堆中的元素个数的差不超过 1。[...]