数据结构与算法(如何利用堆排序实现Top10的热门搜索词)

 1>堆的应用1(优先级队列)

       优先级队列顾名思义,他首先是以个队列,队列他服从先进先出的原则,不过在优先级队列中,他出队的顺序不是先进先出,而是根据优先级来决定的,优先级越高,最先出队列

      用堆来实现一个优先级队列是最直接最高效的,因为堆和优先级队列是非常相似的,往优先级队列插人一个数据,就是往堆中插入一个数据,从优先级队列中取数据,就是取堆中的堆顶元素

      1>合并有序小文件,

                  比如说有这样13个小文件,且他们都是有序的,我们怎样操作才能保证合并后的文件是有序的呢?我们可以每一个文件的第一个字符串放到同一个数组中,进行比较,将较小的字符串所在的文件放到一个大的文件中,并将在数组里面的小字符串进行删除,再继续对数组进行比较,取小字符串,并将该小字符串的文件放到大文件之前的后面,这样执行下去,好多有序的小文件就合并为一个大的有序文件,这里每次都要去遍历都要去小的字符串,比较消费性能.我们可以用堆中的小顶堆去实现这个需求.我们可以取每个小文件的第一个字符串,放到小堆中,那么堆顶元素就是最小的元素,我们每次都去堆顶元素,一次去合并小文件,这样合并后的大文件也是有序的.

  2>应用2(利用堆实现TopK)

            静态数据取TopK:如何在一个包含n个数据的数组中取出前Topk数据,我们可以维护一个大小为k的小顶堆,我们一次取数组中的元素,与堆顶元素进行比较,如果比堆顶元素小,我们不做处理,如果比堆顶元素大,我们就将堆顶元素删除,将该元素插入进去,这样等数组遍历完之后,堆中的数据就是前K大元素了

        动态数据:如果一个数据集合有2种操作,一种是动态的插入数据,一种是动态的查询前k大元素,我们基于当前数据集合重新技术的话,需要的时间复杂度为o(lognk),实际上我们可以维护一个一个k大小的小顶堆,当有数据添加到集合当中的时候,我们就拿该元素与小顶堆中的堆顶元素进行比较,如果该元素比堆顶元素大,我们将堆顶元素进行删除,将该元素进行插入到堆中,如果比堆顶元素大,我们不做任何处理,这样动态的插入集合,小顶堆总是维护着集合中的前大k元素了.

            

   

猜你喜欢

转载自blog.csdn.net/w5201314ws6123/article/details/86454074
今日推荐