对20GB文件进行排序
问题描述
假设有一个20GB的文件,每行一个字符串,请说明如何对这个文件进行排序
问题分析
20GB的文件很难一次加载到内存中,可以采用分块策略,先使块内有序,在使块间有序。
实现思路
按照给定的内存要求(假定为1G),进行分块,分为20个块,我们先对每一块进行排序,可以使用快速排序等时间复杂度底的排序算法,然后进行块的合并,使块间有序,合并时,可以使用两两合并的方式,也可以借助堆,按照堆合并K个有序链表的方式使用堆合并K个有序链表进行合并。
超大文本中搜索两个单词的最短距离
问题描述
有一个超大文本,内部是由很多单词组成的,现给定两个单词word1和word2,请找出文件中这两个单词的最短距离
问题分析
双重循环可以实现,但是时间复杂度过高,可以通过两个变量分别指向两个单词在遍历过程中最后出现的位置来实现,如此可在线性时间复杂度,常数空间复杂度情况下完成。
实现思路
最直接的做法就是遍历文件,依次判断遍历到的所有word1与全部word2的距离,这种方式的时间复杂度为O(n^2),为了简化操作,我们可以拼接下标与单词,并将结果存储到List中,即list=[0I,1am,2a…],合并之后查找更方便,一边遍历一边比较就可以了,但是数据量过大的话,list可能会溢出。事实上,不使用list也能够解决。我们定义两个变量index1和index2,index1用于指向当前遍历过程中word1出现的位置,index2用于指向当前遍历过程中word2出现的位置。|index1-index2|即为两个单词之间的最短距离。
问题进阶
寻找过程重复多次,每次寻找不同单词之间的最短距离
实现思路
可以使用map存储单词和所有下标,使用双指针遍历两个单词的下标列表,即可得到两个单词之间的最短距离
从10亿数字中寻找最小的100万个数字
问题描述
设计一个算法,从10亿数字中寻找最小的100万个数字,假设内存足以容纳全部的10亿个数字
问题分析
可以使用快排、选择、和堆三种方式来实现
实现思路
可以使用快速排序的方式使元素按照升序排列,然后取前100万个元素
也可以使用选择的方式,第一次找到最小的数字,第二次找到第二小的数字,以此类推,第100万次找到第100万小的数字
还可以使用大顶堆来实现,设置一个元素容量为100万的大顶堆,堆未满时,直接加入元素,堆满后,只有当当前元素小于堆顶元素时,才移除堆顶元素并加入当前元素,遍历结束后,堆中的元素即为最小的前100万个数字