堆的应用:如何快速获取到TOP10最热门的搜索关键词?
就是搜索引擎的热门搜索排行榜,搜索引擎每天会接收大量的用户搜索请求,他会把用户输入的搜索关键词记录下来,然后再离线统计分析,得到TOP10搜索关键词
假设我们有一个包含10亿个搜索关键词的日志文件,如何能快速获取到热门榜TOP10搜索关键词?
堆的应用一:优先级队列
优先级队列,首先是一个队列,队列的最大特性就是先进先出,不过,在优先级队列中,数据的出队顺序不是先进先出的,按照优先级来,优先级最高的,最先出队
用堆来实现一个优先级队列,因为堆和优先级队列非常相似,一个堆可以看作是一个优先级队列,往优先级队列中插入一个元素,相当于往堆里插入一个元素;从优先级队列中取出优先级最高的元素,相当于取出堆顶元素
这优先级应用场景很多:
一:合并有序小文件
有100个小文件,每个文件的大小是100MB,每个文件存储的都是有序的字符串,希望将这100个小文件合并成一个有序的大文件,用到优先级队列
从这100个文件中,各取第一个字符串,放入数组中比大小,把最小的那个字符串放入合并后的大文件中,并从数组中删除,这个最小的字符串来自于13.txt这个小文件,再从这个小文件取下一个字符串,放到数组中,重新比较大小,并且选择最小的放入合并后的大文件,将它从数组中删除,依此类推,直到所有的文件中的数据都放入到大文件中为止
用数组存储从小文件中取出来的字符串,每个从数组中取最小字符串,都需要循环遍历整个数组,不是很高效,可以用优先级队列,从小文件中取出来的字符串放入到小顶堆,那堆顶的元素就是优先级队列队首的元素,即最小的字符串,将这个字符串放入到大文件中,将其从堆中删除,然后再从小文件中取出下一个字符串,放入堆中,循环,可以将100个小文件中的数据依次放入大文件中
二:高性能定时器
定时器中维护了很多定时任务,每个任务都设定了一个要触发执行的时间点。定时器每过一个很小的单位时间&#x