搜索引擎会通过日志文件把用户每次检索使用所有查询串都记录下来,每个查询串长度不超过255字节。假设目前有一千万个查询记录(重复度比较高,其实互异查询串不超过三百万个;显然,一个查询串重复度越高,说明查询它用户越多,也就是越热门)。现要统计最热门10个查询串,且要求使用内存不能超过1GB。以下各方法中,可行且效率最高方法是(41)
本题考查数据结构应用知识。
快速排序和堆排序都属于内部排序方法,要求待排序元素序列都放在内存。按最坏情况考虑,一千万个查询串需要存储空I间为225千万字节,也就是2.25×1010)字节,远超过1GB(约等于109)存储容量限制,所以选项A和B是不可行。另外,即便不考虑存储容量限制,在只要求找出最大10个元素时快速排序也是不适用。
选项C和D区别是利用大顶堆还是小顶堆。设想需要在1000个元素中找出10个最大元素,用小顶堆思路是:先用前10个元素建个小顶堆(堆顶是最小元素),此后从第11个元素开始,顺序地将每个元素与堆顶元素比较,若小于或等于堆顶元素就舍弃之,若大于堆顶元素,则用该元素替换堆顶元素,并再次调整为小顶堆。重复该过程,直到最后一个元素处理完,那么,在小顶堆中留下10个元素实际上就是这1000个元素中前10大元素。
本问题中需要在兰百万个元素中按照重复次数找最大10个元素,由于10个元素构成小顶堆建立和调整时所花费时间是个很小常数c0,因此,釆用这种方式在n为三百万个元素时找出10个最大者运算时间是线性阶(大约为n+c0,c0是小整数)。反之,如果采用大顶堆,一种情况是建立10个元素构成大顶堆,则在顺序地处理后面元素时,无法简单地确定需要替换该大顶堆中哪个元素;另一种情况是建立由三百万个元素构成大顶堆,在该数据量情况下,哈希表和大顶堆都在内存存储,可能会突破1GB存储容量限制,而且建立初始大顶堆运算时间(有可能是达到4n)以及后面9次调整大顶堆时间(9logn)时间都远多于前面小顶堆方案。









