青岛达内的小编总结,HashMap统计
对这批海量数据预处理
维护一个Key为Query字串,Value为该串出现次数的HashMap,即HashMap(Query,Value),每次读取一个Query,如果该字串不在HashMap中,则加入该串,并将Value设1
若该串在HashMap,则将该串的计数加一
最终我们在O(N)的时间复杂度内用HashMap完成了统计
堆排序
借助堆这个数据结构,找出Top K,时间复杂度为N*logK,即借助堆结构,我们可以在log量级的时间内查找和调整。
因此,维护一个K(该题目中是10)大小的小根堆,然后遍历300万的Query,分别和根元素进行对比。
所以,我们最终的时间复杂度是O(N) + N' * O(logK),(N为1000万,N‘为300万)。
堆排序思路
维护k个元素的最小堆,即用容量为k的最小堆存储最先遍历到的k个数,并假设它们即是最大的k个数,建堆O(k),调整堆O(logk)后,有
k1>k2>…kmin(kmin设为小顶堆中最小元素)
继续遍历数列,每次遍历一个元素x,与堆顶元素比较,若x>kmin,则更新堆(x入堆,用时logk),否则不更新堆。这样下来,总费时O(k*logk+(n-k)*logk)=O(n*logk)

此方法得益于在堆中,查找等各项操作时间复杂度均为logk
也可以采用trie树,关键字域存该查询串出现的次数,没有出现为0
最后用10个元素的最小堆来对出现频率进行排序。
有一个1G的文件,每一行是一个词,词的大小不超过16字节,内存限制大小是1M.返回频数最高的100个词
由上面那两个例题,分而治之 + hash统计 + 堆/快速排序这个套路再多多验证下。此题又是文件很大,又是内存受限,无非还是
分而治之/hash映射
顺序读文件中,对于每个词x,取hash(x)%5000,然后按照该值存到5000个小文件(记为x0,x1,…x4999)中。这样每个文件大概是200k.
如果其中的有的文件超过了1M,还可以按照类似的方法继续下分,直到分解得到的小文件都不超过1M
HashMap统计
对每个小文件,采用trie树/HashMap等统计每个文件中出现的词以及相应的频率
堆/归并排
取出出现频率最大的100个词(可以用含100个结点的最小堆)后,再把100个词及相应的频率存入文件,这样又得到了5000个文件。最后就是把这5000个文件进行归并(类似于归并排序)的过程了。
以上就是青岛达内给大家做的内容详解,更多关于UI的学习,请继续关注青岛达内